混合DirectX头与C mod项目不起作用

我试图添加一个DirectX 11渲染器(不知道这是甚至可以“简单”的方式)对返回到城堡Wolfenstein源代码,我有一些问题。 我在项目中包含的头文件中有一个渲染类,每当我将其包含在其中一个RTCW文件中时,就会出现此错误:

1> c:\ program files(x86)\ windows kits \ 8.1 \ include \ um \ directxmath.h(17):致命错误C1189:#error:DirectX Math需要C ++

现在我想知道在R项目中使用DirectXmath函数/类(实际上是所有的DirectX类)的方式是什么? 是否有可能改变整个项目设置,以便编译为C ++? 我正在使用Visual Studio 2017。

这是我在XD3D.h头文件中的渲染器类声明:

#include <d3d11.h> #include <DirectXMath.h> #include "XGeomObject.h" #include "XCamera.h" using namespace DirectX; #define GPA(d3dModule, func) GetProcAddress(d3dModule, func) class XD3DRenderer { protected: HMODULE m_XD3DModule; ID3D11Device* m_pD3DDevice; ID3D11DeviceContext* m_pDeviceContext; IDXGISwapChain* m_pSwapChain; ID3D11RenderTargetView* m_pRenderTargetView; ID3D11Texture2D* m_pBackBuffer; ID3D11Texture2D* m_pDepthStencilBuffer; ID3D11DepthStencilState* m_pDepthStencilState; ID3D11DepthStencilState* m_pDisabledDepthStencilState; ID3D11RasterizerState* m_pRasterState; ID3D11DepthStencilView* m_pDepthStencilView; HWND m_wnd; int m_screenWidth, m_screenHeight; bool m_fullScreen; D3DXMATRIX m_world, m_view, m_proj; bool m_lightMapsOn; public: XD3DRenderer(); XD3DRenderer(HWND wnd, int screenwidth, int screenheight,bool fullscreen); ~XD3DRenderer(); ID3D11Device* GetD3DDevice() { return m_pD3DDevice; } ID3D11DeviceContext* GetDeviceContext() { return m_pDeviceContext; } bool LoadDriver(); bool CreateD3DDevice(HWND wnd, int screenwidth, int screenheight, bool fullscreen ); bool CreateRenderTargetView(); bool CreateDepthBuffer(); bool CreateDepthStencilView(); bool CreateDisabledDepthStencilState(); bool Setup(); bool ClearScene(const D3DXCOLOR& col); bool Render(XGeomObject*, XCamera*); bool ShowScene(); void TurnOnZBuffer(); void TurnOffZBuffer(); }; 

我将它包含在RTCW win_glimp.c文件中的C项目中,如下所示:

 #include <assert.h> #include "../renderer/tr_local.h" #include "../qcommon/qcommon.h" #include "resource.h" #include "glw_win.h" #include "win_local.h" #include "../renderer/XD3D.h" extern void WG_CheckHardwareGamma( void ); extern void WG_RestoreGamma( void ); ... rest of win_glimp.c file omitted. 

#error附注是因为DirectXMath使用一堆C没有的C ++function。

Direct3D本身就是一个COM API,如果你愿意的话,可以通过C来使用(有很多有用的macros来调用许多头文件中的函数)。 但DirectXMath不是,也不能直接在C代码中使用。 你可以创建一个包装器:写一个C头文件来声明你需要使用的所有函数,在一个包含DirectXMath的C ++源文件中实现它们,并分别编译为C ++(或静态库)。

但你可能会更好find一个Cmath库,并节省自己的麻烦。

可以将整个游戏项目更改为C ++编译,但这可能不起作用:如果项目使用C ++中不存在的C特性,则必须修改这些错误。 而这种变化可能会在难以追查的地方引入微妙的行为差异。 这不会是我这个庞大代码库的首选。

那么,我能够find一个不需要C ++的math库。 D3DX(Direct3D 9)库基本上和DirectXMath一样。

需要d3dx9math.h。

参考:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb147179(v=vs.85).aspx