【发布时间】:2012-08-26 14:41:19
【问题描述】:
我正在做一个需要以下结构的项目:
这 2 个 CPP 文件包含类,这些类需要 H 文件 1 中的裸函数。类和裸函数需要 H 文件 2 中的变量。
我可以拆分 CPP 文件,以便它们使用 2 个单独的文件,其中包含 nakes 和他们需要的变量。但我更喜欢使用这种结构。
好像编译器跳过了#ifndef命令,我做了个测试:
主要:
#include <iostream>
//1>CPPFile2.obj : error LNK2005: "bool Test1" (?Test1@@3_NA) already defined in CPPFile1.obj
//1>CPPFile2.obj : error LNK2005: "bool Test2" (?Test2@@3_NA) already defined in CPPFile1.obj
int main()
{
}
CPP 文件 1:
#include <iostream>
using namespace std;
#include "HFile1.h"
CPP 文件 2:
#include <iostream>
using namespace std;
#include "HFile2.h"
H文件1:
#include "HFile2.h"
#pragma once
#ifndef Name1
#define Name1
//Use test1, this workes fine
//Use test2, this workes fine
#endif
H文件2:
#pragma once
#ifndef Name2
#define Name2
bool Test1 = false;
bool Test2 = false;
#endif
#ifndef #define #endif 结构怎么可能不能正常工作?
【问题讨论】:
-
通常你不需要让那些包含守卫,因为你已经有一次#pragma。
-
我在不支持#pragma once 的情况下添加了它们,但如果没有其中之一,它仍然无法工作。
-
您违反了一个定义规则。您需要将
Test1和Test2设为static或extern。 -
我确实可以看到其他一些问题。 HFile 1 如何使用 Test1 和 Test2?有功能吗?请记住,如果不包含 HFile2,您的 CPPFile1 将无法访问 Test1 和 Test2。除非您在 HFile1 中使用
extern声明。
标签: c++ include compiler-errors