2015-06-19 22 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很重要,这样编译器可以更好地优化。

相关问题