使用gcc编译器时的隐式int和函数隐式声明

4

我在c99标准中阅读到:

-remove implicit function declaration,

-remove implicit int.

但是当我尝试使用gcc编译器以c99模式并带有-pedantic参数来编译这段代码时
main(void){
    f(3);
    return 0;
}


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

我预计会出现两个错误,但是我只收到了两个警告:
-warning: return type defaults to ‘int’

-warning: implicit declaration of function ‘f’.

在 C99 中不应该出现这些错误吗?

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

谢谢。


相信它只是被弃用了而不是被删除了。 - Alok Save
@Als:不,C99完全删除了它。 - Keith Thompson
1
“-pedantic”只是告诉用户要严格遵守标准。如果您希望编译器在遇到此类问题时停止编译,请使用“-pedantic-errors”。但是,“-Werror”可能会更好(与“-Wall -Wextra”一起使用),因为即使不需要符合标准的警告也是不可取的。 - Daniel Fischer
3个回答

7
C标准要求任何包含语法规则或限制违规的翻译单元必须进行诊断。然而,它并没有要求这些诊断是致命的;编译器可以继续处理源文件。如果有的话,生成的可执行文件的行为是未定义的。标准不区分警告和致命错误。
(唯一需要编译器拒绝源文件的是#error指令。)
结论:在编译C时,请非常认真地对待警告。

4

我认为编译器并不一定要产生致命错误。 如果您担心这个问题,请使用 -Werror ...


4
两点需要注意:首先,编译器通常需要一组特定的标志才能符合标准。其次,标准要求实现在出现错误时发出“诊断”,但是实现定义什么是或不是诊断是由它自己决定的。如果实现希望这个“警告”是诊断,那么就可以这样说。当发出诊断时,它可能会停止编译,也可以继续编译代码。总之,对于符合标准而言,它所做的可能已经足够了,无论价值为何。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接