2012-12-03 99 views
0

此問題正在尋找一個標準報價明確解釋爲什麼這種行爲是錯誤的。這是什麼類型的行爲?

下面的代碼包括<stdio.h>main

int main() 
{ 
#include <stdio.h> 
printf("hello , world \n"); 
return 0; 
} 

gcc -Wall in.c -o in.out它成功地編譯和打印hello , world

但在clang in.c -o in.out它給我這個錯誤:

/usr/include/stdio.h:353:12: error: implicit declaration of 'fprintf' requires 

inclusion of the header <stdio.h> 
extern int fprintf (FILE *__restrict __stream, 
     ^
1 error generated. 

我的疑問是什麼樣的行爲是什麼?這是未定義的行爲還是什麼?

此外,我無法找到與它相關的文檔。

編輯:問題是我發現這個代碼類似於它的地方,但我不能完全發佈該代碼,所以我發佈了這種類型的演示代碼。我知道配置stdio.h以外的主。

+0

你知道這樣的事情現在很容易檢查 - http://ideone.com/z2m2yJ。當然,它不會在GCC上編譯。 – SChepurin

+0

@它是'gcc 4.3'在IDEONE上,但在我的筆記本電腦上'gcc 4.5'這是編譯 – Omkant

+0

這是來自gcc 4.5.1 - http://ideone.com/io4JNG。 – SChepurin

回答

-2

嘗試在主要方法之外包含頭文件。喜歡這個。

#include <stdio.h> 
int main() 
{ 
printf("hello , world \n"); 
return 0; 
} 
+0

-1問題不是「如何解決」,而是「這是明確禁止的」。 – Pubby

+0

我知道......已經......這不是我正在尋找的答案請仔細閱讀問題 – Omkant

5

C99,7.1.2/4:

[...]如果使用 ,報頭應包括任何外部聲明或定義的外部,並且它 應首先被包括在第一次引用它聲明的任何函數或對象之前,或者它定義的任何類型或宏之前。

4/2:

如果出現一個約束之外的「‘應當’」或「不'」的要求被違反時, 行爲是不確定的。

6.9/4:

如在5.1.1.1所討論的,程序文本的預處理後的單元是翻譯單元, 它由外部聲明的序列組成。這些被描述爲''external'' ,因爲它們出現在任何函數之外(因此具有文件範圍)。

所以我認爲這是未定義的行爲。

+0

那麼,哪種情況屬於這種情況呢? –

+2

@LuchianGrigore咦? – melpomene

+0

@LuchianGrigore「標題應包含在任何外部聲明或定義之外」,但是OP將它放在main()的定義之內? –

2

在C++ 11:17.6.2.2/3:

翻譯單元應只包括外部的任何外部聲明或定義的報頭,並應 包括頭詞法在第一參考前將該單位轉換爲在該單據中聲明爲 的任何實體。

main()是extern,所以不是包含的適當上下文。

+0

請注意,「外部」並不一定意味着「外部」。例如,一個'static'函數仍然是一個外部聲明。看到melpomene的答案。這是令人困惑的術語。 –