考虑这个C程序:
int main()
{
puts("Hello world!");
return 0;
}
这个编译并运行正常,据我所知,是合法的C89。但是,我并不是100%肯定。使用clang在C99模式下编译告诉我implicit declaration of function 'puts' is invalid in C99
(这使我认为C标准必须在C99中更改以使隐式函数声明非法,这是我试图确认的)。
C89中的隐式函数声明是否合法? (即使这样做是个坏主意(除非你在混淆的C代码挑战中))
答案 0 :(得分:7)
C89中的隐式函数声明是否合法?
是。来自section 3.3.2.2:
如果括号中的括号参数列表之前的表达式 函数调用仅包含标识符,如果不包含 声明对于此标识符是可见的,标识符是 在包含的最里面的块中隐式声明 函数调用,声明
extern int identifier();
出现。
答案 1 :(得分:1)
隐含的功能声明在C89中是合法的,但在C99中被删除。这可以在C11(ISO / IEC 9899:201x)标准中确认。
在C11 转发部分,它列出了第三版(即C11)和第二版(即C99)的所有主要变更,其中一个是:
第二版的主要变化包括:
...
- 删除隐式函数声明
同样在Rationale for International Standard Programming Languages C§6.5.2.2函数调用
中C99的新功能:在C99中删除了隐式声明函数的规则。其结果是保证生成可以捕获其他类别编程错误的诊断。发出诊断后,实现可以选择采用隐式声明并继续转换,以支持利用此功能的现有程序。