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

How can I share a const char array between two source files gracefully?

为了简化我的代码,我制作了下面的代码片段来解释我的问题:

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.");
}

问题是在编译时不会有问题,但在link时可能会失败,因为const char数组的重新定义,draw[].

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

可能吗?

链接时出现多重定义错误,因为您将 draw 定义 放在 header 文件中。不要那样做。仅将 声明 放入 header,并将 定义 放入一个 .c 文件。

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

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

并将其放入 header:

extern const char draw[];

不幸的是,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很重要,这样编译器可以更好地优化。