隐含function声明在C89中是合法的吗?

考虑这个C程序:

int main() { puts("Hello world!"); return 0; } 

编译并运行正常,据我所知,是合法的C89。 但是,我不是百分百肯定的。 使用clang在C99模式下编译告诉我在C99中implicit declaration of function 'puts' is invalid in C99 (这让我觉得C标准必须在C99中改变以使隐式函数声明非法,这就是我要确认的)。

隐含function声明在C89中是合法的吗? (即使这样做是个坏主意(除非你在混淆的C代码挑战中))

隐含function声明在C89中是合法的吗?

是。 从第3.3.2.2节开始 :

如果函数调用中带括号的参数列表之前的表达式仅包含一个标识符,并且如果此标识符没有可见的声明,则在包含函数调用的最内层块中,标识符被隐式声明为声明

  extern int identifier(); 

出现了。

隐含的函数声明在C89中是合法的,但在C99中被删除。 这可以在C11(ISO / IEC 9899:201x)标准中确认。

在C11 转发部分,它列出了第三版(即C11)和第二版(即C99)中的所有主要更改,其中一个是:

第二版的主要变化包括:

– 删除隐式函数声明

同样在国际标准编程语言的基本原理中C§6.5.2.2 函数调用

C99的新function:在C99中删除了隐式声明函数的规则。 其结果是保证生成可以捕获其他类别编程错误的诊断。 在发出诊断之后,实现可以选择假设隐式声明并继续转换以支持利用此function的现有程序。