首页 > 解决方案 > C - 如果将包含包含在标头中,则重复符号,但如果包含在源文件中则工作正常

问题描述

我有一个包含 int 数组的头文件

primes.h

#ifndef P_H
#define P_H
#include <inttypes.h>

uint64_t primes[] = {
    7,
    11,
};
#endif

lib.h文件中: #include "primes.h"

lib.c包括lib.h

main.c文件中: #include "lib.h"

然后它会导致错误:duplicate symbol '_primes' in:

但如果我搬进#include "primes.h"lib.c,它工作正常。为什么将包含在源代码和标题中可以有所作为?

标签: cincludeheader-files

解决方案


您正在 h 文件中定义一个变量。这意味着您只能将该 h 文件包含在一个编译单元中,即一个 c 文件中。因此,当您将它包含在lib.h并且如果lib.h包含在多个 c 文件中时,您就会遇到麻烦,即多个编译单元将定义数组变量primes。那是行不通的。

规则:不要在 h 文件中定义变量。始终在 c 文件中执行此操作。

(注意:可能会有例外,但这是黄金法则 - 坚持下去,除非你有充分的理由将变量放入 h 文件中)

有关操作说明,请参阅此答案:https ://stackoverflow.com/a/1433387/4386427


推荐阅读