我有一个包含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放在源和标头中可以有所作为?
您正在h文件中定义变量。这意味着您只能将该h文件包含在一个编译单元中,即包含在一个c文件中。因此,当您将其包含在lib.h
中并且如果lib.h
被包含在多个c文件中时,您将遇到麻烦,即多个编译单元将定义数组变量primes
。那行不通。
Rule:不要在h文件中定义变量。始终在c文件中执行此操作。
((注:可能会有例外,但这是黄金法则-除非您有充分的理由将变量放入h文件中,否则请坚持使用)] >>
请参阅此答案以获取操作说明:https://stackoverflow.com/a/1433387/4386427
包含文件时,包含将替换为文件内容(并且继续进行,直到没有包含为止)。