當前位置:編程學習大全網 - 編程語言 - 如果壹個工程中有多個C++源文件,怎麽確定先編譯哪個源文件呢

如果壹個工程中有多個C++源文件,怎麽確定先編譯哪個源文件呢

授人以魚,不如授人以漁.建議樓主好好看看<<C++ primer>>這本書,目前有中文第四版,我非常喜歡它,我也是去年十月份開始學習C++的,看完它再看<<effective C++>>和<<more effective C++>> , 尤其是<<effective C++>>,簡直是C++的聖經,非看不可...最後到高級了.妳還可以看看<<深入探索C++對象模型>>...我全看完了,感覺受益匪淺.

好了,下面開始解答問題:

解答問題之前,復習壹下基本概念;

1:C++中的全局變量,在整個程序中只能定義壹次,但可以聲明多次(不限次數); 在壹個地方定義,,然後在其他地方使用時,要先聲明壹下;

2:什麽叫變量定義? 比如 int i; 這就是定義;

而 extern int i; 則 只是聲明;

但如果寫作 extern int i = 0; 則這也是定義,不是聲明;(是不是有點繞?熟悉了就很簡單了)

所以,我覺得妳的問題.實際上是源自妳對C++語法中變量的定義和聲明這兩個概念的模糊;

妳說妳在a.cpp 中聲明 i, 而在b.cpp中必須用extern 聲明才可通過編譯,這是正常的..因為妳的i是在a.cpp中定義的..

妳說妳在b.cpp中聲明i, a.cpp中是否使用extern都可以通過編譯,這個問題嘛.我估計妳的代碼實際上仍然是在a.cpp中定義了i,而b.cpp中定義的i不是全局的.

至於妳說如果有多個源文件.那麽編譯順序如何確定.這個問題很難回答妳,恐怕不同的編譯器對此的處理都不大相同..我覺得妳不應該考慮這個問題..實際上編譯器會把不同的源文件分別、單獨地編譯成獨立的模塊,最後再鏈接成壹個可執行程序,因為它們都是獨立編譯的模塊,理論上說.編譯順序是不重要的.

我覺得倒是應該告訴妳如何正確地管理和使用全局變量;

首先,建立壹個 "global.h"(文件名隨妳,我這裏舉個例子而已,記得在頭文件裏加上頭文件保護符哦!如果妳告訴我妳不知道什麽是頭文件保護符,我強烈建議妳不要再往下看了..立刻去買壹本C++primer吧);

在global.h文件中.聲明妳所需要的所有全局變量,以下是 global.h的內容:

#ifndef GLOBAL_H

#define GLOBAL_H

extern int g_i; // 此處是聲明,另外,在全局變量前加壹個 g_ 是好習慣.

#endif

然後新建壹個 global.cpp文件,包含 global.h文件,接著,定義所有的全局變量,

以下是global.cpp的內容:

#include "global.h"

int g_i = 1982; // 此處是定義!!!

至此,壹切搞定,最後,在妳需要用到全局變量的cpp文件中包含 global.h吧...比如妳的a.cpp和b.cpp; 編譯順利了吧?

/////////////////////////////////////////////

看到樓主的新問題了..我再補充回答壹下.

問題1:我的疑問是,如果在my.cpp中定義了theApp,則必須在mfc.cpp中用extern聲明theApp,否則編譯出錯;但是如果在mfc.cpp中定義theApp,則不必在my.cpp中聲明,編譯也能夠通過,這是為什麽呢?

我的回答: 這個問題還是聲明和定義的問題.我之前說過了.壹個變量(比如妳的這個theApp),在整個程序中只能定義壹次, 然後在需要使用它的地方,要先聲明後使用.

因此,看看實際情況:妳在my.cpp中定義了theApp,當妳在mfc.cpp中要使用它,當然要先聲明它咯,而聲明變量必須加上extern,不然就變成定義了,那麽就會導致妳在my.cpp和mfc.cpp中定義同名全局變量兩次,自然就無法通過編譯.

而如果妳在mfc.cpp中定義theApp的話,因為在my.cpp中沒有直接用到 theApp.所以,就不需要聲明了.這下清楚了吧?呵呵.

還有,補充壹個基礎知識,,我們通常寫 int i; 這樣的語句是"定義","定義"實際上就起到了"聲明"的作用; 所以,如果妳不是定義變量,而是單純要聲明壹個外部的全局變量(也就是其他cpp文件裏的全局變量)的時候,是肯定要加extern的.

我覺得樓主是對 與要加extern感到詫異.

問題2:

這個程序我運行的結果是只有構造函數的那些輸出語句執行了,而析構函數的那些輸出語句並沒有執行,這又是為什麽呢?

這個講起來有點多.涉及到壹個C++程序的啟動過程:我簡單地說說,

以windows為例,點擊壹個exe程序後,系統創建壹個"進程內核對象",創建4G虛擬內存空間以及其他的壹些執行程序需要的資源,然後創建"線程內核對象",啟動壹個線程(也就是主線程了),這個線程調用壹個 C++ startup函數,該函數會初始化 妳的程序中的所有全局變量,( 這個時候妳就看到妳 theApp的那些基類的構造函數的執行,並打印出來),所有全局變量構造好以後,才開始執行妳寫的main函數.

然後,妳的main函數 return了.這時,執行壹個C++執行期函數exit(),析構妳的所有全局變量(也就是theApp), 但這個時候妳的console窗口已經退出了.所以妳看不到那些析構函數執行時的打印信息了.呵呵.

另外:我真的非常推薦樓主先好好看看<<C++ primer>>和<<effective C++>>這兩本書,不要把<<深入淺出mfc>>當成C++教材來看,雖然這本書很好,並且通過mfc,很好地示範了C++ 繼承,虛函數的妙用.但是,<深入淺出mfc>的作者侯捷說的好:勿於浮沙築高臺.. 基礎打牢非常關鍵. 當妳把C++的基礎知識搞清以後,再看深入淺出 mfc 其實是很簡單的..

  • 上一篇:壹個勤奮的平凡人能在編程上獲得大成就嗎?
  • 下一篇:電視機接口連接方法
  • copyright 2024編程學習大全網