[英]Global constants in .h file, linking problems with gcc, works with g++
我有两个.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文件中声明的全局常量的方式是否有所不同? 我应该考虑哪种方法?
请注意,由于资源有限,所有对象都需要共享常量的内存。
您应该在.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
所有位置包括bar.h
:
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__
定义。
您只应声明:
const struct foo bar;
并在.c
文件中为其分配值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.