2017-06-30 43 views
3

我有多個C文件1.c 2.c和3.c及其相應的頭文件1.h 2.h 3.h.這些文件使用相同的靜態字符*變量,所以我想在一個頭文件中定義這個變量。有沒有解決方法?在頭文件中定義char

像:#定義nameVariable valueVariable

NB:

  • 的C文件中沒有包括的其它標題(​​即1.C不包括2.H和3.H等)。

  • 所有這3個文件都包含一個4.h文件。

  • 所有這3個文件都具有相同的Makefile。

+3

不要在標題中定義變量。總是有更好的選擇。你總是可以使用'extern'。 –

+0

'#define'用於定義宏而不是變量。 – Barmar

+0

我不能使用#define? –

回答

1

如果所討論的變量是一個永遠不會改變的常量字符串,那麼您可以使用#define這樣做。

在4.H:

#define MY_STATIC_STRING "my_string" 

這將在每一個源文件的任何地方使用MY_STATIC_STRING執行文本替換。

+0

如果我有一個函數使用這個靜態字符串(即functionX(static char * x);)將被接受? –

+0

是的,'#define'是一個字符串常量,所以你可以在任何需要'char *'的地方使用它。 – dbush

3

在4.H將這個,所有3包括:

extern char* myGlobalVar; 

這將聲明變量(就像在聲明頭文件功能),因此編譯器不會抱怨時它會在其他.c文件中引用myGlobalVar(知道它已被聲明)。 然後把這個一個(且僅1)的3個文件的(1.C 2.C或3.C):

char* myGlobalVar = "blah"; 

定義的變量,它的實際值分配給它(就像在相應的.c文件中定義函數一樣)。可以有一個標識符的多個聲明(如myGlobalVar),但只有一個定義。因此,您可以在所有.h文件中編寫extern char* myGlobalVar;,但只能在其中一個.c文件中編寫char* myGlobalVar = "blah";

現在,您可以在任何3 c文件中訪問myGlobalVar,只要它們全部包含4.h.

+1

這裏應該提到術語。這是在頭文件中「聲明」變量,並在3個.c文件之一中「定義」變量。 –