这个无辜的程序是否会调用未定义的行为:
int main(void) { printf("%dn", 1); return 0; }
是调用printf()
而没有适当的原型(来自标准头文件
或来自正确编写的声明)调用未定义的行为。
如C11附录J中所述(仅供参考)
J2未定义的行为
本附件不是规范性的,但清楚地将上述代码记录为未定义行为的示例。
用更务实的话来说,在没有printf
原型的情况下,编译器会生成调用序列,就好像printf
被定义为int printf(const char*, int)
,这可能是完全不同的,并且与printf
的实际实现不兼容。标准库,定义为int printf(const char restrict *format, ...)
。
古代ABI足够常规,这不会引起问题,但现代(例如64位)ABI使用更有效的调用序列,使上述代码绝对不正确。
因此,这个着名的经典C程序也会失败,没有#include
或者至少是printf
原型:
int main(void) { printf("Hello worldn"); // undefined behavior return 0; }
以上就是c/c++开发分享没有正确的原型调用printf会调用未定义的行为吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545938.html