.h文件中的全局常量,与gcc链接问题,与g ++一起使用

时间:2011-08-26 13:43:34

标签: c++ c gcc

我有两个.c文件和一个.h文件。在.h文件中,我声明了全局常量。使用gcc构建时,我会遇到链接问题,告诉我常量定义了两次,即使我有

#ifndef __FOO
#define __FOO

const struct foo bar = ...

#endif

我得到了

/tmp/ccql6KF1.o:(.rodata+0x0): multiple definition of `bar'

但是,使用g ++编译完全相同的代码非常有效。 C和C ++处理.h文件中声明的全局常量的方式有什么不同吗?我应该考虑什么方法?

请注意,由于资源有限,所有对象都需要共享常量的内存。

2 个答案:

答案 0 :(得分:4)

您应该在.h文件中声明常量并将其定义在单个.c文件中:

bar.h:

extern const struct foo bar;

bar.c:

#include "bar.h"

/* do this in a single file */
const struct foo bar = ...;

然后在您想要访问bar.h的任何地方添加bar

something.c:

#include "bar.h"

void doSomethingWithBar() {
    struct *foo something = &bar;
    ...
}

编辑(由Shahbaz提供):这个工作原理和你的代码不起作用的原因是,当你包含一个文件时,该文件的内容被复制粘贴而不是#include(这与文件无关,你可以包含任何东西,包括扩展名为.h的文件只是一种惯例。因此,当您在头文件中说const struct foo bar;并将其包含在两个文件中时,就像在两个文件中写入该行一样,因此在两个文件中定义变量,从而导致链接错误。

您的标头保护也不起作用(

#ifndef __BAR_H__
#define __BAR_H__
... header contents
#endif

)因为每个源文件都是单独编译的,因此当bar.h包含在一个文件中并且__BAR_H__定义时,当编译下一个文件时,__BAR_H__的定义将丢失。

答案 1 :(得分:2)

您应该只声​​明:

const struct foo bar;

并在.c文件中为其指定值。