1. 程式人生 > >.c檔案和.cpp檔案導致的編譯問題

.c檔案和.cpp檔案導致的編譯問題

今天在編譯OpenGL紅寶書附帶原始碼中的light.c檔案時遇到一個詭異的問題:

如圖light .c,在不做任何修改的情況編譯OK。然而只要在某些地方寫了可執行程式碼,則會無法通過編譯器編譯!

(這幾行程式碼如果寫在main函式裡的第一句則OK)

我用的VS08.我把該檔案發給其他朋友(用的VS10),同樣也是這樣的問題。

然而,我把檔名改成light.cpp後,問題解決了。

現在的問題是,程式碼檔案按的字尾背後,會如何影響編輯器的編譯呢?

可以做一個簡單的測試:

int main()
{

#ifdef __cplusplus
    printf("已定義__cpluslus");
#else
     printf("未定義__cpluslus");
#endif
    return 0;
}


測試結果就是:如果編譯的是cpp檔案,則編譯器會自動幫你加入__cplusplus巨集,並使用C++的編譯規則。這一點MSDN其實已經明確說明:

賦予檔案 .c 副檔名,例如 mysource.c

Visual C++ 編譯器自動假定帶 .C 副檔名的檔案是 C 檔案而不是 C++ 檔案,並且拒絕 C++ 語法和關鍵字(如 public、private 和 class)。

C++ 檔案使用 .cpp 副檔名。


再來個非主流的測試。如果編譯的既不是.c檔案,也不是.cpp檔案呢?

筆者把副檔名改為light.DD,結果是顯示了已定義__cplusplus.也就是說vs預設除了.c檔案外,統統認為是c++檔案來編譯。

奇怪的是,MSDN上是這樣描述的:

副檔名決定處理檔案的方式。副檔名為 .c、.cxx 或 .cpp 的 C 和 C++ 檔案將被編譯。其他檔案(包括 .obj 檔案、庫 (.lib) 和模組定義 (.def) 檔案)將傳遞給連結器而不經過處理。


現在回到最初的問題。

light.c為什麼偏偏在加上了執行程式碼(哪怕是空程式碼)也會無法通過編譯呢?如果是因為編譯器的問題,為什麼不加那幾行“魔鬼程式碼”之前是編譯ok的呢?

這僅僅是編譯器的bug嗎?