.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;
...
}
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
文件中赋值
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 将Rust汇编的动态库与GCC联系起来
- .h文件中的全局常量,将问题与gcc联系起来,适用于g++