.h文件中的全局常量,将问题与gcc联系起来,适用于g++

Global constants in .h file, linking problems with gcc, works with g++

本文关键字:gcc 联系 起来 g++ 适用于 问题 文件 全局 常量      更新时间:2023-10-16

我有两个。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;
    ...
}

Edit (by 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文件中赋值