2013-06-05 107 views
0

我可能有一個愚蠢的問題,但沒有問題是愚蠢的我會問它...讓我們想象我有文件matrix.hppmatrix.cpp。在這些文件中,我使用assert(...)來確保某些條件得到尊重。我編譯這個文件並得到一個matrix.o文件。現在,我將在許多不同的程序中使用這個matrix.o文件,其中一些只是測試,需要檢查assert(...)條件,而其他人正在運行的程序不需要這些檢查。C++鏈接和編譯標誌

我的問題是:我可以編譯matrix.o沒有-DNDEBUG標誌,因此通常情況下,assert(...)條件將被檢查。但是當我鏈接不需要檢查的程序的.o文件時,我添加了這個標誌而沒有重新編譯matrix.o文件。

更確切地說,這會做我想做:

# the test program with the "assert(..)" checks  
test:test.o matrix.o 
    gcc -o [email protected] $^ 
test.o:test.cpp matrix.hpp 
    gcc -c $^ 

# the real program without the "assert(..)" checks 
prog:prog.o matrix.o 
    gcc -o [email protected] $^ -DNDEBUG 
prog.o:prog.cpp matrix.hpp 
    gcc -c -DNDEBUG $^ 

# the matrix.o that can be either checked or not if the -DNDEBUG flag 
# is given when the .o files are linked 
matrix.o:matrix.cpp matrix.hpp 
    gcc -c $^ 

好的,謝謝您的回答!所以我不能簡單地使用標誌-DNDEBUG。如果有什麼我的每個矩陣中的文件使用「斷言(......)」一次,我補充一下:

#ifdef CHECK 
assert(...) 
#endif 

,現在當我編制了「試驗」方案我使用檢查標記,但不與「編程」程序?我想這也行不通...

+0

我認爲兩個相關的問題是相關的:http://stackoverflow.com/questions/8035394/gnu-make-how-to-make-conditional-cflags 其中引用http://stackoverflow.com/questions/ 5127977/makefile-define-compilation-variables-based-on-target-for/5153406#51​​53406 –

回答

0

簡短的回答是沒有。根據具體情況,可能會有一些巧妙的技巧(例如鏈接到不同的「斷言失敗」功能)。

你有沒有考慮拋出異常而不是斷言?然後,'prog'和'test'可以採用不同的方法來處理它。

+0

PS:顯然(?),在matrix.hpp中定義的函數中的任何斷言(假定是#include -d prog.cpp和test.cpp)將以您想要的方式工作。 – peterpi

+0

謝謝!是的,我認爲拋出一個異常,但我不想這樣做,因爲運行成本增加... – PinkFloyd

0

不,與GCC無關。我看到兩個選項:

  1. 編譯matrix.o兩個版本,並鏈接相應的版本爲每個程序,或
  2. 與手動檢查拋出異常代替assert

即使在非測試程序中,後面的選項顯然有一些運行時成本,所以小心使用它(不在內部循環中)。