Syntax Error: missing ; before *

Syntax Error: missing ; before *

当我尝试 运行 这些 headers:

Direct3D.h

#pragma once

//Library Linker
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "dxgi.lib")

//Includes
#include <d3d11.h>

//My Includes
#include "SimpleShaderRessource.h"


class Direct3D
{
public:
    Direct3D();
    ~Direct3D();

    bool Initialize(HWND);
    bool Run();
    void Shutdown();

private:

public:

private:
    ID3D11Device* g_pDevice;
    ID3D11DeviceContext* g_pDeviceContext;
    IDXGISwapChain* g_pSwapChain;
    ID3D11RenderTargetView* g_pRenderTargetView;

    SimpleShaderRessource* g_pSimpleShader;

};

SimpleShaderResource.h

#pragma once

//My Includes
#include "Direct3D.h"

//Library Inludes
#include "CGE_Lib.h"

//Models
#include "Triangle.h"


struct SimpleShaderVertex
{
    CGE::Vector3D position;
    //CGE::Color color;
};

class SimpleShaderResource
{
public:
    SimpleShaderResource();
    ~SimpleShaderResource();

    bool Initialize(ID3D11Device*, ID3D11DeviceContext*, HWND, WCHAR*, WCHAR*);
    bool Render();
    void Shutdown();

private:
    void OutputShaderErrorMessage(ID3DBlob*, HWND, WCHAR*);

public:
    ID3D11InputLayout* g_pLayout;
    Triangle* g_pModel;

};

Triangle.h

#pragma once

#include "Direct3D.h"

class Triangle
{
public:
    Triangle();
    ~Triangle();

    bool Initialize(ID3D11Device*);
    void Shutdown();


    ID3D11Buffer* g_pVertexBuffer;
    ID3D11Buffer* g_pIndexBuffer;

    UINT g_indexCount;
};

我从 VS2015 得到这些错误:

C2143   syntax error: missing ';' before '*'    simpleshaderresource.h  34  
C4430   missing type specifier - int assumed. Note: C++ does not support default-int    simpleshaderresource.h  34  
C2238   unexpected token(s) preceding ';'   simpleshaderresource.h  34  
C2143   syntax error: missing ';' before '*'    direct3d.h  34  
C4430   missing type specifier - int assumed. Note: C++ does not support default-int    direct3d.h  34  
C2238   unexpected token(s) preceding ';'   direct3d.h  34  

但我看不出这些语法错误应该从何而来。 #pragma once 应该防止循环包含,所以我做错了什么?

首先,正如@marcinj 指出的那样,有一个错字。在 Direct3D.h 中,SimpleShaderRessource* g_pSimpleShader; 与 class 名称不匹配 SimpleShaderResource

修复后将成为循环依赖问题。

#pragma once should prevent circular includes so what did I wrong?

没有。 #pragma once 旨在保证当前文件在一次编译中只包含一次。防止循环包含仍然是您的责任。

并且您将 "SimpleShaderRessource.h" 包含在 Direct3D.h 中,并将 "Direct3D.h" 包含在 SimpleShaderRessource.h 中。

似乎classDirect3DSimpleShaderRessource.h中没有使用,所以只需从SimpleShaderRessource.h(和Triangle.h)中删除#include "Direct3D.h"

只包含必要的文件是个好习惯。

SimpleShaderResource.h 中,您预先包含了一些其他 headers。如果它们包含任何 incompleteness/errors - 编译器在分析 SimpleShaderResource.h.

中的以下代码时可能会遇到问题 由于这些 headers 似乎不是外部的(您将它们包含在 "" 中,而不是 < >),所以它们可能是您的。仔细检查它们,或者尝试注释掉它们(程序将无法编译,但可能会更容易找到有问题的;通常是最后一个包括在内)