我認爲預處理器一個接一個地處理文件,我無法弄清楚如何使用include進行處理,所以我認爲這是不可能的,但聽到別人的想法會很棒。是否可以使用其他cpp文件中的#define?
我在a.cpp
:
#define A 1
,我想從2.cpp
使用它。編輯: 我不能修改第一個文件。所以現在我只是複製了定義。但問題仍然存在。
我認爲預處理器一個接一個地處理文件,我無法弄清楚如何使用include進行處理,所以我認爲這是不可能的,但聽到別人的想法會很棒。是否可以使用其他cpp文件中的#define?
我在a.cpp
:
#define A 1
,我想從2.cpp
使用它。編輯: 我不能修改第一個文件。所以現在我只是複製了定義。但問題仍然存在。
定義源文件內部不被其他翻譯單元看到。實現文件是分開編譯的。
您可以
const int A = 1;
在實現文件,當你想使用它聲明它extern const int A;
。其中,我會說第一個選項可能是最糟糕的,你可以使用。
如果您想在兩個源文件之間共享一個定義,請將其移至一個頭文件並從兩個源文件中包含該頭。
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
您也可以在指定的編譯器命令行的定義。儘管如此,爲了維護跨平臺代碼(對於不同的編譯器可能需要不同的命令行),這可能非常繁瑣。
您需要將#define
放在一個頭文件中,然後由這兩個cpp文件執行#include
d。
像一種方式 - 使用extern const變量。
例如:
file1.h(在這裏您將使用的定義)
extern const int MY_DEF;
#if (MY_DEF == 1)
//some another definitions
#endif
文件2。H(在這裏你將定義的定義)
const int MY_DEF = 1
臨&缺點:
(+):你可以使用一些值定義
( - ):所有的定義必須定義
在file2.h中定義,並在兩個實現文件中包含file2.h(。 cpp)會給出重複定義的鏈接器錯誤。 –
現在選擇extern似乎是最爲理智和侵入性較弱的方法來解決它,+1 – Yola
我必須對一攬子聲明提出問題,包括標題中的#define是最糟糕的方式!我不想成爲每日跆拳道「啊,如果你在嵌入式環境中沒有文件系統等等」,但肯定會出現#define比const int更好的情況。 – Vicky
就文件依賴性和耦合選項1和3而言,似乎是等效的。我在這裏錯過了什麼嗎? – CpILL