C 常見問題

2021-04-18 08:10:02 字數 1041 閱讀 1854

1. 預處理

預處理的主要作用就是對資源進行等價替換,最常見的預處理有:檔案包含(#include ),條件編譯(#if,#ifndef,#ifdef,#endif,#undef),布局控制(#pragma),巨集替換等(#define)等。

1.1 標頭檔案中放什麼?

標頭檔案一般用於類的定義、extern變數和函式的宣告。由於標頭檔案可能被包含在多個原始檔中,所以不應該含有變數定義或函式的定義。比如不要將這樣的定義:

extern int a = 10;   //有初始化,相當於定義。

const int a = 10; //可以,但是最好將其定義到原檔案中,然後用 extern int a; 引入。

int a; //將其定義到原檔案中,然後用 extern int a; 引入。

1.2 #include如何工作?

預處理時用標頭檔案裡的內容替換每乙個#include的地方。所以需要用頭檔案保護符(#ifndef ...  #define ... #endif)以防止多重包含。<>中的標頭檔案表示標準標頭檔案,查詢時開始於預定義的位置;""中的標頭檔案是非系統檔案,查詢時開始於原始檔所在路徑。

2. 編譯連線

編譯連線是編譯器的事情,但應該知道這個過程都做了些什麼。(以下過程為轉抄,我覺得不是說的很清楚

首先是預編譯,由cpp完成。將c和cpp檔案轉為*.i檔案。 

然後是編譯過程,由cc完成。檔案是基本的編譯單元,編譯後將生成由帶變數的彙編語句組成的*.s檔案。

之後是彙編過程,由彙編器as完成。生成*.o/*.obj檔案,其實就是可重定位的連線格式檔案。

最後是連線過程,由用ld/link完成。主要任務是符號匹配和重定位符號,生成可執行檔案。

3. c++基礎知識

C 常見問題

問題描述 解決方式 無法解析的外部符號 public cdecl minidl operator operator void 0operator minidl qeaa xz 該符號在函式 public cdecl minidl denseop denseop void 0denseop minid...

c 常見問題

編譯器總是根據型別來呼叫類成員函式。但是乙個派生類的指標可以安全地轉化為乙個基類的指標。這樣刪除乙個基類的指標的時候,c 不管這個指標指向乙個基類物件還是乙個派生類的對 象,調刪除線格式用的都是基類的析構函式而不是派生類的。如果你依賴於派生類的析構函式的 來釋放資源,而沒有過載析構函式,那麼會有資源...

C 常見問題

1.reinterpret cast,static cast,dynamic cast const cast區別 2.類的大小 class ctest1 int size sizeof ctest1 1class ctest2 static void func2 protected static i...