C-如果在头文件中包含include,则重复符号,但如果在源文件中包含include,则可以正常工作

问题描述 投票:0回答:2

我有一个包含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,则效果很好。为什么将include放在源和标头中可以有所作为?

c include header-files
2个回答
2
投票

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

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

((注:可能会有例外,但这是黄金法则-除非您有充分的理由将变量放入h文件中,否则请坚持使用)] >>

请参阅此答案以获取操作说明:https://stackoverflow.com/a/1433387/4386427


1
投票

包含文件时,包含将替换为文件内容(并且继续进行,直到没有包含为止)。

© www.soinside.com 2019 - 2024. All rights reserved.