1. 副檔名為 .c 的檔案由 C compiler 編譯。
  2. 副檔名為 .cpp 的檔案由C++ compiler 編譯。
  3. 每個 function 都有供內部使用的名稱,且在 C 與 C++ 之下的內部名稱並不相同。
  4. 例如:
    
    void plus(int a, int b);
    
    其在C之下的內部名稱可能是 _plus;
    而在C++之下的內部名稱卻是 _plus_int_int
    (註:也正因為如此C++才能overload名字相同,但參數的變數型態不同的functions)
        
  5. 當compiler在編譯一個function時,compiler會產生一個內部名稱。
  6. 以下是各種可能發生的情況:
    @ 當 C compiler 看到一個正常的 function 的宣告(declaration, function prototype),它永遠都產生 C style 的內部名稱。
    @ 當 C++ compiler 看到一個正常的 function 的宣告,它產生 C++ style 的內部名稱。
    @ 當 C++ compiler 看到一個使用 extern "C" function 的宣告,它產生 C style 的內部名稱。
  7. 當 compiler 在編譯一個 function call 時,compiler 會它會使用內部名稱。之後,linker 再用該內部名稱去找那個 function。
  8. 以下是各種可能發生的情況:
    @ 當 C compiler 看到一個 function call (該 function 正常宣告), 它會使用 C style 的內部名稱(永遠如此)。 之後,linker 用該內部名稱去 locate 該 function。
    @ 當 C++ compiler 看到一個 function call (該 function正常宣告), 它會使用 C++ style 的內部名稱。 之後,linker 用該內部名稱去 locate 該 function。
    @ 當 C++ compiler 看到一個 function call (該 function 的宣告出現在 extern "C" scope (一對大括弧)中,它會使用 C style 的內部名稱。 之後,linker 用該內部名稱去 locate 該 function。
  9. 當 compiler 和 linker 的內部名稱不是相同的 style, 則 Linking 時會產生連接錯誤。
  10. 重點一:在 .c 內不要使用到 C++ 的函數,會 link 不到。
  11. 重點二:同上,main 內有混用 C 與 C++ 時,需放在 .cpp 內。
  12. ...
  13. ...

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()