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. 未定義的函數調用JavaScript的原型方法時
- 3. 這是否會調用未定義的行爲?
- 4. 原型js調用自定義函數
- 5. AngularJS:回調定義正確嗎?
- 6. 可以調用printf()塊嗎?
- 7. 正確定義原型的方法
- 8. 原型Class.create沒有正確的子類
- 9. IE8中的RequireJs:「沒有定義調用..」
- 10. 多個並行調用到udp :: socket :: async_receive_from - 未定義的行爲?
- 11. ExecutorService沒有正確調用中斷()
- 12. Contextmenu menuitem沒有正確調用
- 13. JavaScript函數沒有被調用正確
- 14. 有沒有辦法在調用對象的未定義函數時調用自定義函數?
- 15. ESP的值沒有正確保存....和C/C++調用約定
- 16. 的Sql未能調用領域正確
- 17. JPanel沒有正確調整
- 18. 爲什麼有人會使用printf()幾乎所有的原因?
- 19. 爲什麼正確的「respond_to」格式沒有被調用?
- 20. 爲什麼我在定義原型時無法調用函數?
- 21. 調用未定義的關係[user_id]在模型[應用\用戶]
- 22. 的JavaScript函數原型沒有定義
- 23. 未定義無法調用
- 24. 原則2.1 - 調用未定義的方法+ MyMethod(Proxy)?
- 25. 調用父原型
- 26. 自定義調試printf在運行時使用
- 27. 未定義參考`的printf」
- 28. 自定義JButton沒有正確調整大小?
- 29. Ubuntu:JAVA_HOME沒有正確定義
- 30. getView()沒有被自定義ArrayAdapter調用
小問題行爲。無論它來自''都不重要。程序也可以提供自己的'printf'原型聲明。 –
hvd
@ hvd:同意,我將重新解釋答案。原型可以來自不同的來源,但它必須與C庫中的'printf'的實際定義兼容。 – chqrlie
嗯,嚴格來說,你的問題的答案(見標題)是* no *。正如你自己指出的那樣,頭文件[而不是使用'''可以被*正確書寫的聲明*替代。 –
Matsmath