语法错误:缺少;前 *

Posted

技术标签:

【中文标题】语法错误:缺少;前 *【英文标题】:Syntax Error: missing ; before * 【发布时间】:2016-06-01 10:24:24 【问题描述】:

当我尝试运行这些标头时:

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;

;

三角形.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 应该防止循环包含所以我做错了什么?

【问题讨论】:

请取消粗体问题 【参考方案1】:

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

修复后会变成循环依赖问题。

#pragma once 应该防止循环包含所以我做错了什么?

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

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

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

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

【讨论】:

是的,那是错误。非常感谢。会尽快将其设置为答案:) @Rafiwui 不客气。顺便说一句,只包括你需要的就是一个好习惯。 是的,通常我会这样做,但在这种情况下,我将d3d11.h 包含在我的Direct3D.h 中,并且不想将它重新包含在其他的中,因为我不得不再次编写#pragma comment(...)。但是我的一个朋友告诉我把它们放在主要位置,现在它更干净了。再次感谢您的帮助。 @songyuanyao 你确定是循环依赖引起的吗? OP 在第 34 行有错误,在 Direct3D.h 中这一行有SimpleShaderRessource* g_pSimpleShader;。在SimpleShaderRessource 中有一个错字:double ss。类名是class SimpleShaderResource @marcinj 我错过了那个错字......无论如何,在修复它之后,我们仍然会面临循环依赖。我会把这个添加到答案中......【参考方案2】:

SimpleShaderResource.h 中,您预先包含了一些其他标题。如果它们包含任何不完整/错误 - 编译器在分析 SimpleShaderResource.h 中的以下代码时可能会遇到问题。 由于这些标题似乎不是外部的(您将它们包含在 "" 中,而不是 ),因此它们可能是您的。仔细检查它们,或者尝试将它们注释掉(此时程序将无法编译,但也许更容易找到有罪的;通常是最后一个)

【讨论】:

以上是关于语法错误:缺少;前 *的主要内容,如果未能解决你的问题,请参考以下文章

vs2008编译错误:error C2146: 语法错误 : 缺少“;”(在标识符“name”的前面)

显式链接错误 - 语法错误:缺少 ';'由 bazel 编译时在 '*' 之前

javascript 语法错误,缺少“;”

Jest with Styled Components 错误:解析预期 css 的语法错误:缺少“”

SQL 错误或缺少数据库(“?”附近:语法错误)

SQL 语法错误(缺少运算符)