我在使用
的每个头文件中包含头文件时遇到了问题#pragma once
文件结构:
Main.cpp
- includes
Main.h
class definition
Main.h
- includes
"class.h"
"random_header.h"
others ( windows , fstream )
class declaration
Class.h
- includes
"Main.h"
class cApplication{ };
Other headers ( class, random_header ) include Main.h
类声明中Main.h中的错误:
error C2146: syntax error : missing ';' before identifier 'App' ( App is class name )
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
我会感谢任何帮助/提示。
Main.h代码
#pragma once
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <fstream>
using namespace std;
#include "D3Ddefs.h"
#include "cApplication.h"
extern cApplication App; //error
LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);
好的,你提出更多的代码,在我看来发布整件事情有点无意义(如果不是,请告诉我),所以我只想补充一下这应该是重要的。
Main.cpp的
#include "Main.h"
cApplication App;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreviousInstance,LPSTR lpcmdline,int nCmdShow)
{ ... }
D3Ddefs.h(完整)
#pragma once
#include "Main.h"
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct D3DVERTEX
{
float fX,
fY,
fZ;
DWORD dwColor;
};
cApplication.h
#pragma once
#include "Main.h"
class cApplication
{
private:
...
};
cApplication.cpp
#include "cApplication.h"
cApplication::cApplication(void)
{ ...
}
答案 0 :(得分:2)
您所拥有的是循环包含问题。手动将#includes中的每一个#includes替换为包含内容的文件,按照它们发生的顺序,忽略以前包含的任何文件,您将在cApplication.cpp中看到“extern cApplication App”;发生在cApplication的声明之上。
至于如何解决这个问题?如果不知道为什么 cApplication.h需要Main.h,实际上无法告诉你。如果你可以将这种依赖性分开,你应该没问题。您是否尝试使cApplication成为某种singleton,包括Main.h,以便您可以访问该“App”变量?
答案 1 :(得分:1)
首先,不应该依赖#pragma once
,因为pragma指令依赖于编译器,在将代码移植到其他平台/编译器时可能会给您带来很多麻烦。
我更喜欢使用的是:
#ifndef __MY_HEADER_FILE_NAME__H
#define __MY_HEADER_FILE_NAME__H
...
... header file code here
...
#endif /* #ifndef __MY_HEADER_FILE_NAME__H */
回到你的代码,问题可能是由于上面提到的问题(尽管可能性很小),或者可能是因为cApplication App
的去除有些错误/错误。
D3Ddefs.h or cApplication.h
也有可能在文件中的某些位置缺少分号。
根据您提供的信息确定确切原因有点困难。如果上述某项内容对您不起作用,请尝试发布导致问题的较小版本的代码
<强> [更新] 强>
这对我来说很好。我正在使用更新的代码并修改了这部分:
class cApplication
{
private:
... --> replaced this with "int a;"
};
所以我认为问题出在class cAplication
减速的地方。
答案 2 :(得分:1)
从错误中我认为标题变得一团糟。我无法从上面确切地看出它是如何出错的,但是如果首先包含“cApplication.h”,则会尝试包含“main.h”,然后再尝试包含“cApplication.h”。在这种情况下,“#pragma once”或include guard将阻止再次包含“cApplication.h”(因此此时不会解析类定义)。然后它将继续解析“main.h”,并试图在没有触及定义的情况下尝试“extern cApplication app”(一旦我们完成main.h就会得到它)。
您需要简化头文件之间的交叉依赖关系,以阻止这些递归包含它们。将公共库内容拆分为另一个标头,您可以将其包含在所有其他标头中,并且只尝试包含标头中绝对必要的内容。 (即为什么D3Ddefs.h包含main.h,当它只需要windows.h和d3d9.h / d3d9x.h时它最多需要它)。