3

考虑这个 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 代码挑战))

4

2 回答 2

8

C89 中的隐式函数声明合法吗?

是的。从第 3.3.2.2 节

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

    extern int  identifier();

出现了。

于 2013-07-07T01:35:43.303 回答
1

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

在 C11 Forward部分,它列出了第三版(即 C11)和第二版(即 C99)的所有主要变化,其中之一是:

第二版的主要变化包括:

...

— 删除隐式函数声明

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

C99 的一个新特性:在 C99 中删除了函数隐式声明的规则。其效果是保证生成将捕获额外类别的编程错误的诊断。发出诊断后,实现可以选择采用隐式声明并继续翻译,以支持利用此功能的现有程序。

于 2013-07-11T08:24:32.103 回答