我有一个头文件和两个源文件。在所述头文件中,我有以下声明:
const char *letters[] = {"A", "B", "C", "D"};
我已将头文件包含在两个源文件中。当我尝试编译时,我得到:
/tmp/cc6gLw9s.o:(.data+0xa0): multiple definition of `letters'
/tmp/ccjqd0rr.o:(.data+0xa0): first defined here
答案 0 :(得分:5)
如果单独编译2个源文件并且每个源文件都包含标题,那么变量letters
将在每个源文件中声明两次。要防止这种情况,请在头文件中将变量声明为extern
。
extern const char *letters[];
然后,将实际变量放在 1 源文件中。
const char *letters[] = {...};
答案 1 :(得分:1)
在C中包含一个文件几乎就是在复制和粘贴它。如果在同一个编译中包含两次标题,那么就好像该代码被写了两次。
通常使用预处理器来防止标头被编译两次。
#ifndef _MYHEADERS_H_
#define _MYHEADERS_H_
const char *letters[] = {"A", "B", "C", "D"};
#endif
这是对其他答案中提出的问题的补充。
答案 2 :(得分:0)
除@Schwern's answer外,您还可以执行此操作:
#pragma once
const char *letters[] = {"A", "B", "C", "D"};
请注意,#pragma once
不是标准C,但它是supported on most compilers。