繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM