c - 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
,它工作正常。为什么将包含在源代码和标题中可以有所作为?
解决方案
您正在 h 文件中定义一个变量。这意味着您只能将该 h 文件包含在一个编译单元中,即一个 c 文件中。因此,当您将它包含在lib.h
并且如果lib.h
包含在多个 c 文件中时,您就会遇到麻烦,即多个编译单元将定义数组变量primes
。那是行不通的。
规则:不要在 h 文件中定义变量。始终在 c 文件中执行此操作。
(注意:可能会有例外,但这是黄金法则 - 坚持下去,除非你有充分的理由将变量放入 h 文件中)
有关操作说明,请参阅此答案:https ://stackoverflow.com/a/1433387/4386427
推荐阅读
- java - 如何在 Visual Studio 代码中创建 Java Web 应用程序?
- php - $(document).ready(function () 无法调用控制器中的函数
- regex - 正则表达式 Ruby 如何对括号内的每个单词进行分组
- json - Invoke-RestMethod utf8 字符?
- javascript - 使用 javascript 在 selenium java 中突出显示元素不起作用
- php - 在 Ubuntu 18.04 上搜索和替换 mPDF、CAM'PDF 上的问题
- r - 将因子转换为数字时出现问题
- python - 我可以使用 gspread 成功创建带有数据的工作表,但通知/发送电子邮件给用户的功能不再起作用。这里的错误在哪里?
- postgresql - 在 Postgres 中完成一个简单的索引查找需要读取多少页?
- python - 尝试在 Azure 上部署 Django 服务器时出现“ModuleNotFoundError: No module named 'django'”