c - 由于头文件,编译C项目导致重复符号
问题描述
我正在尝试编译我编写的 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)
与所有其他类似常量相同。否则,如果必须从不同的编译单元访问它们,它们将存储在内存中并从中读取,从而对性能产生负面影响。
推荐阅读
- python - 如何使用 Python 2.7 从字符串列表中替换部分字符串
- javascript - 避免在过滤器循环中使用多个 indexOf
- css - CSS calc() 与多个单位的乘法
- visual-studio-2017 - CS2012 无法打开 .exe 进行写入 - 访问路径被拒绝
- python - 创建一个 Pandas 散点图,其中一个轴是索引
- c++ - 如何基于 QGraphicScene 缩放/调整 QGraphicsWidget 的大小?
- android - 链接使用 c++_static 构建的两个库
- oauth-2.0 - Identity Server 4:支持密码授予类型的刷新令牌
- python - 熊猫数据框。列一致性。将整数值带入固定长度
- android - 视图类子可以点击吗?