我在c99标准中读到了:
-remove implicit function declaration,
-remove implicit int.
但是当我尝试使用-pedantic
在c99模式下使用gcc编译器编译此代码时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 在这两种情况下都写有“完成”。
感谢。
答案 0 :(得分:7)
对于包含违反语法规则或约束的任何翻译单元,C标准都需要诊断。它不要求这种诊断致命;编译器可以继续处理源文件。生成的可执行文件的行为(如果有)未定义。该标准不区分警告和致命错误。
(要求编译器拒绝源文件的唯一事情是#error
指令。)
结论:编译C时,要非常认真地对待警告。
答案 1 :(得分:4)
我不相信编译器 required 会产生致命错误。如果您担心,请使用-Werror
答案 2 :(得分:4)
两点:首先,它可能(通常会)采用一组特定的标志来使编译器符合标准。
其次,标准所要求的只是实现在出现错误时发出“诊断” - 但是由实现来定义什么是或不是诊断。可以自由地说“警告”是一种诊断,如果它想要的话。发出诊断时,它可能会退出编译,或者无论如何都可以编译代码。
底线:它正在做的事情可能足以符合,无论价值多少。