chq*_*lie 10

printf()没有正确的原型(从标准头文件<stdio.h>或正确编写的声明)调用是调用未定义的行为.

如C11附录J中所述(仅供参考)

J2未定义的行为

  • 对于在函数原型定义函数的范围内调用没有函数原型的函数,原型以省略号结束或者升级后的参数类型与参数类型不兼容(6.5.2.2) .

本附件不是规范性的,但清楚地将上述代码记录为未定义行为的示例.

在更实用的词汇中,在没有原型的情况下printf,编译器生成调用序列,好像printf被定义为int printf(const char*, int)可能完全不同,并且与printf标准库中的实际实现不相容,定义为int printf(const char restrict *format, ...).

古代ABI足够常规,这不会引起问题,但现代(例如64位)ABI使用更有效的调用序列,使上述代码绝对不正确.

因此,这个着名的经典C程序也会失败,没有#include <stdio.h>或者至少是一个适当的原型printf:

int main(void) {
    printf("Hello world\n");  // undefined behavior
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 那么,严格来说你问题的答案(见标题)是*no*.正如您自己指出的那样,头文件[而不是使用`<stdio.h>`可以替换为*正确编写的声明*. (4认同)