我正在尝试在 Windows 上构建我的项目,这对我来说是第一次。我是该平台的初学者。我正在使用 clang-cl 来支持 C11。最初用于注释永远不会返回的函数noreturn
的源。<stdnoreturn.h>
我在编译时遇到了一大堆 declspec 错误,并尽可能将其缩小到一个微不足道的文件。
#include <stdnoreturn.h>
#include <stdlib.h>
要么他们自己构建得很好,但他们一起 产生了一个错误的洗衣清单,所有这些都是完全相同的类型:
__declspec attributes must be an identifier or string literal
所有这些都对同一宏扩展的变化感到不满:
[build] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\vcruntime.h(326,20): error: __declspec attributes must be an identifier or string literal
[build] __declspec(noreturn) void __cdecl __report_gsfailure(_In_ uintptr_t _StackCookie);
[build] ^
[build] C:\PROGRA~1\LLVM\lib\clang\8.0.1\include\stdnoreturn.h(27,18): note: expanded from macro 'noreturn'
[build] #define noreturn _Noreturn
我已经尝试将 -fms-extensions 和 -fms-compatibility 传递给 clang-cl 并且没有骰子。我最好的猜测是,clang 对 Windows 在该 declspec 中添加关键字感到不安?我对任何 MS 扩展都不太了解。
使用普通的旧_Noreturn
工作正常,所以我可以编译我的代码。但是有没有人更深入地了解这里发生了什么以及修复是什么?将 msvc 和 clang 结合起来是天生的 janky 还是我做错了什么?
编辑:我是个白痴。
问题是宏扩展_declspec(noreturn)
在 Windows SDK 标头内部中断。解决方案很明显:
#include <stdlib.h>
#include <stdnoreturn.h>
哪个构建得很好,因为宏是在使用的 Windows SDK 标头之后定义的declspec(noreturn)