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

时间:2013-07-07 01:28:36

标签: c language-lawyer c89

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

2 个答案:

答案 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中删除了隐式声明函数的规则。其结果是保证生成可以捕获其他类别编程错误的诊断。发出诊断后,实现可以选择采用隐式声明并继续转换,以支持利用此功能的现有程序。