2015-06-19 56 views
2

爲了簡化我的代碼,我把下面的代碼片段來解釋我的問題:如何優雅地共享兩個源文件之間的const char數組?

def.h

#ifndef _DEF_H_ 
#define _DEF_H_ 
const char draw[] = "Draw on the canvas:" 
#endif 

circle.c

#include "def.h" 

void draw_circle(void) 
{ 
    printf("%s %s", draw, "a circle."); 
} 

的main.c

#include "def.h" 

int main(void) 
{ 
    printf("%s %s", draw, "nothing."); 
} 

問題是在編譯時沒有問題,但由於重新定義了const char數組,draw[]可能會在鏈接時失敗。

如何防止此問題在兩個源文件之間共享一個常量字符數組,而無需將它們放入單個編譯單元中,方法是在main.c的頂部添加#include"circle.c"

可能嗎?

+0

除非你犯了一個錯字,否則'main.c'的頂部不需要包含'circle.c'和'def.c'。保留'def.h'並創建一個單獨的編譯單元,命名爲'def.c',就像@YuHao指出的那樣。不要忘記在def.c中包含'def.h'以避免聲明/定義不匹配的風險。 –

回答

3

鏈接時會出現多重定義錯誤,因爲您將定義draw放在頭文件中。不要這樣做。在報頭中只放置聲明,並將定義放在一個.c文件中。

在你例子,把這個在.c文件

const char draw[] = "Draw on the canvas:" 

,並把這個在標題:

extern const char draw[]; 
+0

extern const char draw [20] –

+0

需要在頭文件中添加char數組的長度。 否則如果您嘗試獲取變量的長度,您會得到錯誤 –

0

不幸的是C中沒有真正的命名常量對於這樣的類型。唯一的可能性是宏。對於字符串你可以做

#define draw "Draw on the canvas:" 

,或者如果你要堅持,這是const合格:

#define draw (char const*)"Draw on the canvas:" 
#define draw (char const[]){ "Draw on the canvas:" } 

最後給出了其他類型的可能性,使用複合文字。這裏使用const很重要,這樣編譯器可以更好地優化。

相關問題