编译clang'时出现declspec错误;s<;noreturn.h>;以及Windows标题

编译clang'时出现declspec错误;s<;noreturn.h>;以及Windows标题,c,windows,clang,c11,clang-cl,C,Windows,Clang,C11,Clang Cl,我正试图得到一个我的Windows建筑项目,这对我来说是第一次。我是平台的初学者。我使用clang cl来支持C11。源代码最初使用中的noreturn对永远不会返回的函数进行注释。我在编译时遇到了一大堆declspec错误,并将其缩小到尽可能小的一个文件 #include <stdnoreturn.h> #include <stdlib.h> 我尝试过将-fms扩展和-fms兼容性传递给clang cl,但没有成功。我最好的猜测是clang对Windows在decls

我正试图得到一个我的Windows建筑项目,这对我来说是第一次。我是平台的初学者。我使用clang cl来支持C11。源代码最初使用
中的
noreturn
对永远不会返回的函数进行注释。我在编译时遇到了一大堆declspec错误,并将其缩小到尽可能小的一个文件

#include <stdnoreturn.h>
#include <stdlib.h>
我尝试过将-fms扩展和-fms兼容性传递给clang cl,但没有成功。我最好的猜测是clang对Windows在declspec中添加关键字感到不安?我对任何MS扩展都不太了解

使用普通的old
\u Noreturn
可以很好地工作,因此我可以让我的代码进行编译。但是,有没有人对这里发生的事情和解决办法有更多的了解?msvc和clang的结合是天生的强悍还是我做错了什么

编辑:我是个白痴

问题是宏扩展正在破坏Windows SDK头中的
\u declspec(noreturn)
。解决办法显而易见:

#include <stdlib.h>
#include <stdnoreturn.h>
#包括
#包括

它构建得很好,因为宏是在使用declspec(noreturn)的Windows SDK头之后定义的。

我已经在编辑中发布了答案,但为了解决这个问题,我将在这里发布一个扩展版本

问题源于C11标准与Windows特定的C/C++扩展之间的冲突。Windows使用早于C11的扩展存储类。它为不随
\uu declspec(noreturn)
返回的函数提供了一个存储类

不幸的是,这与C11中的关键字宏冲突。微软可能并不认为这是一个问题,因为他们并不声称对C11有任何支持。如果您试图在定义宏的情况下使用Windows SDK头,编译器会通过原始问题中列出的有点神秘的错误消息抱怨在declspec中使用了关键字(
noreturn
扩展为
\u noreturn
,C11中添加的实际关键字)


答案很简单:只要你的代码没有试图混合使用
\uu declspec(noreturn)
noreturn
,这将是多余的,只需在其他系统头之后包含
头即可。预处理器不会在Windows SDK头中展开
noreturn
,所有内容都将是协同工作的。

我会责怪微软,现在和永远:你特别想用MSVC标准库构建DDo吗?使用MinGW提供的libstdc++的Clang是一个很好的选择。我想这是一个Clang错误,他们从来没有考虑过
\u declspec
中的
\u noreturn
可以扩展到
\u declspec
中的
\u noreturn
,您能否澄清一下,是否只有这两个包含在您的第一个代码片段中才导致了问题?标题上写着“连同Windows标题”,但您没有显示任何包含的Windows标题。看起来要做的事情是提交错误报告,并且不要使用
stdnoreturn
,除非您想更改编译器。FWIW msys2 clang和gcc都没有问题。或者,您可以跳过支持C11特性的代码,也可以在MSVC下编译。您可能需要一些
#ifdef
#include <stdlib.h>
#include <stdnoreturn.h>