文章目錄
- c編譯和c++編譯有什么區別
- 多態
- 函數重載
- 虛函數表 vtable
- 輸入輸出同步
- 類型檢查
- 模板和特化
- 鏈接 C++ 標準庫
- C++ 能編譯 C 的代碼嗎?
c編譯和c++編譯有什么區別
多態
函數重載
C++ 支持多個同名函數(參數不同),這是編譯期多態
編譯器需要在編譯階段進行重載決議(Overload Resolution)
-
編譯器要收集更多函數簽名信息;
-
編譯的符號名需要進行 name mangling(名稱修飾),比如 _Z3fooi 表示 foo(int);
_Z 是 GCC 名稱修飾的前綴,3 表示函數名的長度,foo 是函數名,i 表示一個 int 類型的參數
兩個int用ii,兩個double用dd
虛函數表 vtable
盡管是運行時多態,也需要編譯時生成 虛函數表和指針
輸入輸出同步
iostream 默認與 stdio 同步
iostream 類型安全,重載 <<, >> 運算符,無需格式字符串.
<通過函數重載機制>
類型檢查
C++更嚴格, 不允許隱式把 void* 轉成 int*
模板和特化
模板:編寫與類型無關的代碼
讓 iostream 能夠支持用戶定義類型的輸入輸出
class Point {
public:int x, y;
};std::ostream& operator<<(std::ostream& os, const Point& p) {return os << "(" << p.x << ", " << p.y << ")";
}
鏈接 C++ 標準庫
C++ 程序除了鏈接 C 標準庫外,還需要鏈接到 C++ 標準庫。
C++ 能編譯 C 的代碼嗎?
不完全能。
- c++ 不允許 void* 自動類型轉換
- struct 在 C 中必須加上
在 C++ 中編譯 C 文件,最好加上:
extern "C" {#include "c_header.h"
}
關閉 C++ 的 name mangling,讓編譯器用 C 的方式處理符號名。