.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嗎?