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

Cor*_*lks 3 c c89 language-lawyer

考虑这个C程序:

int main()
{
    puts("Hello world!");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Oli*_*rth 7

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

是.从第3.3.2.2节开始:

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

    extern int  identifier();
Run Code Online (Sandbox Code Playgroud)

出现了.

  • 在这种特殊情况下,它具有良好定义的行为,因为`puts`恰好返回一个`int`结果.对于非`int`函数,行为将是未定义的.当然最好只添加`#include <stdio.h>`. (2认同)