以下是在論壇中看到的兩種解釋:
(1)如果是要你的代碼在編譯時發現編譯器類型,就判斷_cplusplus或_STDC_宏,通常許多編譯器還有其他編譯標志宏,
#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
如果要判斷已經編譯的代碼的編譯類型,就用nm查一下輸出函數符號是否和函數名相同。(相同為c,不同為c++。詳解見下面)
(2)
簡單是說,由於c語言是沒有重載函數的概念的,所以c編譯器編譯的程序里,所有函數只有函數名對應的入口。而由於c++語言有重載函數
的概念,如果只有函數名對應的入口,則會出現混淆,所以c++編譯器編譯的程序,應該是函數名+參數類型列表對應到入口。
注意,因為main函數是整個程序的入口,所以main是不能有重載的,所以,如果一個程序只有main函數,是無法確認是c還是c++編譯器
編譯的
可以通過nm來查看函數名入口
如一個函數
int foo(int i, float j)
c編譯的程序通過nm查看
foo 0x567xxxxxx (地址)
c++編譯程序,通過nm查看
foo(int, float) 0x567xxxxxx
另外,如果要在c++編譯器里使用通過c編譯的目標文件,必須通知c++編譯器,我使用的函數是c風格的,不需要列出參數列表的,這樣c++編譯才能正確的連接
extern "c" foo;
