缺少类型说明符错误

时间:2011-01-04 18:45:47

标签: c++

我在使用

的每个头文件中包含头文件时遇到了问题
#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)
{ ...
}

3 个答案:

答案 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时它最多需要它)。

相关问题