【发布时间】: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
textconst,你违反了单一定义规则 -
只是扩展 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++