some part of code image, another part of code image,我是 DirectX 12 (或游戏编程)的初学者,并从Microsoft文档学习。在使用函数ThrowIfFailed()
时,我从 vs2015 编辑器的intellisense中收到错误
此声明没有存储类或类型说明符。
任何人都可以提供帮助。
答案 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)));