如何优雅地在两个源文件之间共享一个const char数组?

时间:2015-06-19 08:31:25

标签: c c99 c11

为了简化我的代码,我在下面的代码片段中解释了我的问题:

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[],它可能会在链接时失败。

如何通过在#include"circle.c"的顶部添加main.c来优雅地在两个源文件之间共享一个const char数组而不将它们放入一个编译单元中?

有可能吗?

2 个答案:

答案 0 :(得分:3)

链接时会出现多个定义错误,因为您将draw定义放在头文件中。不要那样做。只在标题中加上声明,并将定义放在一个.c文件中。

在您的示例中,将其放在.c文件

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

并将其放在标题中:

extern const char draw[];

答案 1 :(得分: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很重要,这样编译器可以更好地进行优化。