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

【问题讨论】:

make text 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 ++编译器多次查找标头中定义的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C/C++ 中多次包含头文件[重复]

在c中声明与定义变量[重复]

C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]

传递参数以更改#define变量[重复]

C语言中的枚举类型

头文件重复包含和变量重复定义