4

我在 c99 标准中读到:

-remove implicit function declaration,

-remove implicit int.

但是当我尝试使用 gcc 编译器在 c99 模式下使用 -pedantic 编译此代码时

main(void){
    f(3);
    return 0;
}


int f(int a){
    ....
}

我预计会有 2 个错误,但我只收到 2 个警告:

-warning: return type defaults to ‘int’

-warning: implicit declaration of function ‘f’.

它们不应该是c99中的错误吗?

http://gcc.gnu.org/c99status.html 在这两种情况下都写着“完成”。

谢谢。

4

3 回答 3

7

C 标准要求对包含违反语法规则或约束的任何翻译单元进行诊断。它不需要这样的诊断是致命的;编译器可以自由地继续处理源文件。生成的可执行文件的行为(如果有)是未定义的。该标准不区分警告和致命错误。

(唯一需要编译器拒绝源文件的是#error指令。)

结论:在编译 C 时,非常重视警告。

于 2012-06-23T16:45:00.837 回答
4

两点:首先,它可能(通常确实)采用一组特定的标志来使编译器符合标准。

其次,该标准所要求的只是实现在发生错误的情况下发出“诊断”——但由实现来定义什么是或不是诊断。如果愿意,可以自由地说“警告”是一种诊断。当发出诊断时,它可能会退出编译,或者它可以编译代码。

底线:它所做的可能足以符合要求,无论其价值如何。

于 2012-06-23T16:46:19.540 回答
4

我不相信编译器需要产生致命错误。-Werror如果您担心,请使用...

于 2012-06-23T16:29:51.250 回答