首页 > 解决方案 > 由于头文件,编译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 个变量)和一些结构。

标签: ccompiler-errorsheaderduplicates

解决方案


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

例子:

extern const uint32_t NODE_TYPE_SIZE;

然后在 .c 文件中定义它们。

顺便说一句,这些变量没有任何意义,它们应该是宏。

#define NODE_TYPE_SIZE sizeof(uint8_t)

与所有其他类似常量相同。否则,如果必须从不同的编译单元访问它们,它们将存储在内存中并从中读取,从而对性能产生负面影响。


推荐阅读