C ++编译器多次查找标头中定义的值[重复]
Posted
技术标签:
【中文标题】C ++编译器多次查找标头中定义的值[重复]【英文标题】:C++ Compiler finds values defined in header multiple times [duplicate] 【发布时间】:2016-03-28 16:36:57 【问题描述】:由于 C++ 中的一个(实际上是基本且简单的)问题,我在互联网上搜索了大约半小时。也许我错过了一些东西,但我不知道是什么。可以说,我有 3 个文件:“main.cpp”、“dosomething.cpp”和“Header.h”。
“标头.h”:
#pragma once
#ifndef HEADER_H
#define HEADER_H
char text[] = "This is a text";
#endif // !HEADER_H
“main.cpp”
#include <stdio.h>
#include <iostream>
#include "Header.h"
using namespace std;
void main()
cout << text << endl;
和“dosomething.cpp”
#include "Header.h"
void dosth()
现在编译器/链接器告诉我“文本”已经在另一个文件中定义了。为什么?我知道#pragma once 和#ifndef 等警卫习语是如何工作的——至少我是这么认为的。我不知道这里有什么问题。代码本身有效(当不包括“dosomething.cpp”中的标头时)。
有什么想法吗?
编辑:我使用 Visual Studio 2015
【问题讨论】:
maketext
const
,你违反了单一定义规则
***.com/questions/7926224/…
只是扩展 user1320881 的评论:这里发生的是:当你编译 main.cpp 时,Header.h 只包含一次;当你编译 dosomething.cpp 时,Header.h 只包含一次;现在他们两个都有text
的定义,链接器抱怨。你的头部守卫正在做他们的工作,但防止这个问题不是他们的工作。
找到 . -name '.h' -o -name '.hpp' | xargs -n1 -d '\n' grep "#define HEADER_H" |排序 | uniq -cd
【参考方案1】:
您需要输入 extern 关键字。对于每个 .c/.cpp 文件,C/C++ 都会合并文件的文本,并且所有定义都将在链接步骤中合并。如果你在头变量之前写了'extern',你可以在一个C++文件中定义它,所有其他文件都会重用它。链接器将只使用您将其外部化到的变量的一个实例。
所以在 header.h 中
#pragma once
extern char text[];
main.cpp 保持不变,但“dosomething.cpp”略有变化
#include "Header.h"
(...)
char text[] = "...";
(...)
https://en.wikipedia.org/wiki/External_variable
【讨论】:
以上是关于C ++编译器多次查找标头中定义的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章