【问题标题】:C++ Compiler finds values defined in header multiple times [duplicate]C ++编译器多次查找标头中定义的值[重复]
【发布时间】: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,你违反了单一定义规则
  • 只是扩展 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

标签: c++


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多