哪个头文件包含DirectX 12中的ThrowIfFailed()

时间:2017-10-17 11:47:00

标签: c++ visual-c++ directx directx-12

some part of code image, another part of code image,我是 DirectX 12 (或游戏编程)的初学者,并从Microsoft文档学习。在使用函数ThrowIfFailed()时,我从 vs2015 编辑器的intellisense中收到错误

  

此声明没有存储类或类型说明符。

任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:1)

  

由于您不熟悉DirectX编程,我强烈建议从DirectX 11而不是DirectX 12开始。 DirectX 12假设您已经是专家DirectX 11开发人员,并且是一个非常无情的API。如果您打算成为一名图形开发人员,那绝对值得学习,但从DX 12开始,超过DX 11是一项艰巨的任务。请参阅DX11和/或DX12 DirectX工具包教程

对于现代DirectX示例代码和VS DirectX模板,Microsoft使用标准辅助函数<h3>Beethoven Symphony Survey</h3> <table id="myTable"> <tr> <th></th> <th></th> <th></th> <th></th> <th onclick="sortTable(0)"><div class="DESCRIPTION_text">Name ⇕</div></th> <th onclick="sortTable(1)"><div class="DESCRIPTION_text">Orchestra ⇕</div></th> <th onclick="sortTable(2)"><div class="DESCRIPTION_text">Label ⇕</div></th> <th onclick="sortTable(3)"><div class="DESCRIPTION_text">Year Comp. ⇕</div></th> </tr> <tr> <td><!--Abbado--></td> <td><!--Vienna Phil--></td> <td><!--DG--></td> <td><!--YEAR1--></td> <td colspan="4" data-sort-method='none'> Claudio Abbado, Vienna Philharmonic <br> DG, 1990 <br> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div></td> </tr> <tr> <td><!--Abbado--></td> <td><!--Berlin Phil I--></td> <td><!--DG--></td> <td><!--YEAR2--></td> <td colspan="4" data-sort-method='none'> Claudio Abbado, Vienna Philharmonic <br> DG, 1990 <br> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div></td> </tr> <tr> <td><!--Abbado--></td> <td><!--Berlin Phil II--></td> <td><!--DG--></td> <td><!--YEAR3--></td> <td colspan="4" data-sort-method='none'> Claudio Abbado, Vienna Philharmonic <br> DG, 1990 <br> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div></td> </tr> <tr> <td><!--Albrecht--></td> <td><!--Yomiuri Nippon--></td> <td><!--Exton--></td> <td><!--YEAR4--></td> <td colspan="4" data-sort-method='none'> Gerhard Albrecht, Yomiuri Nippon <br> Exton, 1993 <br> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div></td> </tr> <tr> <td><!--Karajan--></td> <td><!--Philharmonia--></td> <td><!--Exton--></td> <td><!--YEAR5--></td> <td colspan="4" data-sort-method='none'> Herbert von Karajan, Berlin Philharmonic <br> DG, 1975 <br> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div> <div style="display:inline-block;border:1px solid #F00;">IMAGE<br> Text</div></td> </tr> </table>。它不是操作系统或系统标题的一部分;它只是在本地项目的预编译头文件(ThrowIfFailed)中定义的:

pch.h

对于COM编程,您必须在运行时检查所有#include <exception> namespace DX { inline void ThrowIfFailed(HRESULT hr) { if (FAILED(hr)) { // Set a breakpoint on this line to catch DirectX API errors throw std::exception(); } } } 值是否失败。如果忽略特定DirectX 11或DirectX 12 API的返回值是安全的,它将返回HRESULT。您通常使用void来快速失败&#39;场景(即如果函数失败,你的程序无法恢复)。

  

请注意,建议使用C++ Exception Handling(a.k.a。ThrowIfFailed),这是VS模板中的默认编译器设置。在x64和ARM平台上,这可以非常高效地实现,而无需任何额外的代码开销。 Legacy x86需要编译器创建的一些额外的epilog / prologue代码。大多数&#34; FUD&#34;本机代码中的异常处理是基于使用旧的异步结构化异常处理(a.k.a。/EHsc)的经验,这严重阻碍了代码优化器。

有关更多详细信息和使用信息,请参阅this wiki page。您还应该阅读ComPtr上的页面。

GitHub上的我的Direct3D游戏VS模板版本中,我使用了/EHa的略微增强版本,你也可以使用它:

ThrowIfFailed

答案 1 :(得分:0)

此错误是因为您的某些代码不属于任何函数。

您的错误就在这里:

void D3D12HelloTriangle::LoadPipeline() {
#if defined(_DEBUG) { //<= this brack is simply ignore because on a pre-processor line

        ComPtr<ID3D12Debug> debugController;
        if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) {
            debugController->EnableDebugLayer();
        }
    } // So, this one closes method LoadPipeline
#endif

// From here, you are out of any function
ComPtr<IDXGIFactory4> factory;
ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));

所以要纠正它:

void D3D12HelloTriangle::LoadPipeline() {
#if defined(_DEBUG) 
    { //<= just put this bracket on it's own line

        ComPtr<ID3D12Debug> debugController;
        if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) {
            debugController->EnableDebugLayer();
        }
    } // So, this one close method LoadPipeline
#endif

// From here, you are out of any function
ComPtr<IDXGIFactory4> factory;
ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));