我有两个.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文件中声明的全局常量的方式有什么不同吗?我应该考虑什么方法?
请注意,由于资源有限,所有对象都需要共享常量的内存。
答案 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
文件中为其指定值。