包含数组声明标题时出错

时间:2017-03-09 18:17:37

标签: c

我有一个头文件和两个源文件。在所述头文件中,我有以下声明:

const char *letters[] = {"A", "B", "C", "D"};

我已将头文件包含在两个源文件中。当我尝试编译时,我得到:

/tmp/cc6gLw9s.o:(.data+0xa0): multiple definition of `letters'
/tmp/ccjqd0rr.o:(.data+0xa0): first defined here

3 个答案:

答案 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