c - 由于头文件,编译C项目导致符号重复

标签 c compiler-errors header duplicates

我正在尝试编译我编写的C项目,并且头文件具有一些常量变量。此头文件包含两个.c文件,但是,这会导致符号重复错误。
我的项目结构如下:(a => b表示b包含a)

common.h => struct.h
struct.h => btree.h
btree.h => btree.c && project.c
导致错误的相关常量保留在struct.h
我应该如何重建项目以避免这种困惑?
我的常数看起来像:
const uint32_t NODE_TYPE_SIZE = sizeof(uint8_t);
const uint32_t NODE_TYPE_OFFSET = 0;
const uint32_t IS_ROOT_SIZE = sizeof(uint8_t);
const uint32_t IS_ROOT_OFFSET = NODE_TYPE_SIZE;
const uint32_t PARENT_POINTER_SIZE = sizeof(uint32_t);
const uint32_t PARENT_POINTER_OFFSET = IS_ROOT_OFFSET + IS_ROOT_SIZE;
const uint8_t COMMON_NODE_HEADER_SIZE =
    NODE_TYPE_SIZE + IS_ROOT_SIZE + PARENT_POINTER_SIZE;
struct.h具有这些类型的变量(除了上述变量外,还包含约20个变量)和某些结构。

最佳答案

不要在.h文件中定义常量。仅将它们声明为extern例:

extern const uint32_t NODE_TYPE_SIZE;
然后在.c文件中定义它们。
顺便说一句,这些变量没有任何意义,它们应该是宏。
#define NODE_TYPE_SIZE sizeof(uint8_t)
与所有其他类似常量相同。否则,如果必须从不同的编译单元访问它们,它们将被存储在内存中并从中读取,这会对性能产生负面影响。

关于c - 由于头文件,编译C项目导致符号重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62923922/

相关文章:

Android:如何使用 SectionIndexer

c++ - 这个严格的别名示例是否正确?

python - qpython android IOError : [Erno 2] No such file or directory

c - 为什么我在获取时间戳时得到负值?

java - 初学者 Java 构造函数中不需要参数错误

c# - ToastContentBuilder' 不包含 'Show' 的定义

javascript - 在 ExpressJS 中创建身份验证 header 。 Java 到 Javascript 的翻译

java - 如何在标题中添加按钮

c - 普通 C 的预处理器元编程库

shell脚本和C之间的通信