为了简化我的代码,我在下面的代码片段中解释了我的问题:
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数组而不将它们放入一个编译单元中?
有可能吗?
答案 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
很重要,这样编译器可以更好地进行优化。