如何优雅地在两个源文件之间共享一个 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
很重要,这样编译器可以更好地优化。
为了简化我的代码,我制作了下面的代码片段来解释我的问题:
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
很重要,这样编译器可以更好地优化。