6
A
回答
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使用更有效的調用序列,使上述代碼絕對不正確。沒有正確的原型調用未定義調用`的printf()`:
因此,這個著名的經典的C程序會失敗過,沒有#include <stdio.h>
或至少是正確的原型printf
:
int main(void) {
printf("Hello world\n"); // undefined behavior
return 0;
}
相關問題
- 1. 原型不能調用未定義
- 2. 調用未定義函數printf()__
- 3. 原型方法沒有被正確調用
- 4. 沒有正確調用kinetic.js?
- 5. 未定義的函數調用JavaScript的原型方法時
- 6. 這個C++ 11 lambda代碼調用未定義的行爲嗎?
- 7. 這是否會調用未定義的行爲?
- 8. 這是否會在C中調用未定義的行爲?
- 9. 原型js調用自定義函數
- 10. UIAlertview沒有調用正確的功能
- 11. AngularJS:回調定義正確嗎?
- 12. 調用C函數沒有原型
- 13. 原型函數沒有被調用
- 14. 可以調用printf()塊嗎?
- 15. 正確定義原型的方法
- 16. 如何在Ruby中調用printf時正確轉義%?
- 17. OnRenderSizeChanged調用不正確嗎?
- 18. 原型Class.create沒有正確的子類
- 19. 調用未定義的函數定義()
- 20. printf的未知精確型
- 21. IE8中的RequireJs:「沒有定義調用..」
- 22. 多個並行調用到udp :: socket :: async_receive_from - 未定義的行爲?
- 23. 沒有名爲「調度」的bean定義
- 24. JavaScript函數沒有被調用正確
- 25. MSMessagesAppViewController沒有正確調用didSelect()?
- 26. ExecutorService沒有正確調用中斷()
- 27. 析構函數沒有正確調用
- 28. repaint()沒有從actionlistener正確調用
- 29. Contextmenu menuitem沒有正確調用
- 30. 這是大會的正確定義嗎?
小問題行爲。無論它來自''都不重要。程序也可以提供自己的'printf'原型聲明。 –
hvd
@ hvd:同意,我將重新解釋答案。原型可以來自不同的來源,但它必須與C庫中的'printf'的實際定義兼容。 – chqrlie
嗯,嚴格來說,你的問題的答案(見標題)是* no *。正如你自己指出的那樣,頭文件[而不是使用'''可以被*正確書寫的聲明*替代。 –
Matsmath