2013-01-11 39 views
7

我認爲預處理器一個接一個地處理文件,我無法弄清楚如何使用include進行處理,所以我認爲這是不可能的,但聽到別人的想法會很棒。是否可以使用其他cpp文件中的#define?

我在a.cpp

#define A 1 

,我想從2.cpp使用它。編輯: 我不能修改第一個文件。所以現在我只是複製了定義。但問題仍然存在。

回答

16

定義源文件內部不被其他翻譯單元看到。實現文件是分開編譯的。

您可以

  • 把它們放在一個頭,並將其納入
  • 使用編譯器的選項
  • 做理智的方式 - const int A = 1;在實現文件,當你想使用它聲明它extern const int A;

其中,我會說第一個選項可能是最糟糕的,你可以使用

+0

現在選擇extern似乎是最爲理智和侵入性較弱的方法來解決它,+1 – Yola

+2

我必須對一攬子聲明提出問題,包括標題中的#define是最糟糕的方式!我不想成爲每日跆拳道「啊,如果你在嵌入式環境中沒有文件系統等等」,但肯定會出現#define比const int更好的情況。 – Vicky

+0

就文件依賴性和耦合選項1和3而言,似乎是等效的。我在這裏錯過了什麼嗎? – CpILL

7

如果您想在兩個源文件之間共享一個定義,請將其移至一個頭文件並從兩個源文件中包含該頭。

mydefines.h:

#ifndef MY_DEFINES_H 
#define MY_DEFINES_H 

#define A (1) 
// other defines go here 

#endif // MY_DEFINES_H 

source1.cpp:

#include "mydefines.h" 
// rest of source file 

source2.cpp:

#include "mydefines.h" 
// rest of source file 

您也可以在指定的編譯器命令行的定義。儘管如此,爲了維護跨平臺代碼(對於不同的編譯器可能需要不同的命令行),這可能非常繁瑣。

4

您需要將#define放在一個頭文件中,然後由這兩個cpp文件執行#include d。

-1

像一種方式 - 使用extern const變量。

例如:

file1.h(在這裏您將使用的定義)

extern const int MY_DEF; 

#if (MY_DEF == 1) 
//some another definitions 
#endif 

文件2。H(在這裏你將定義的定義)

const int MY_DEF = 1 

臨&缺點:

(+):你可以使用一些值定義

( - ):所有的定義必須定義

+0

在file2.h中定義,並在兩個實現文件中包含file2.h(。 cpp)會給出重複定義的鏈接器錯誤。 –

相關問題