回答

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; 
} 
+0

小問題行爲。無論它來自''都不重要。程序也可以提供自己的'printf'原型聲明。 – hvd

+0

@ hvd:同意,我將重新解釋答案。原型可以來自不同的來源,但它必須與C庫中的'printf'的實際定義兼容。 – chqrlie

+4

嗯,嚴格來說,你的問題的答案(見標題)是* no *。正如你自己指出的那樣,頭文件[而不是使用'''可以被*正確書寫的聲明*替代。 – Matsmath