众所周知,微软的 Visual Studio 编译器不支持 C99,而且看起来他们没有计划支持它。
但是,编译器确实包含一些精心挑选的功能,例如可变参数宏和long long
- 请参阅这个答案中的引号:
当我们收到许多对某些 C99 功能的请求时,我们会尝试实现它们(或类似功能)。几个例子是可变参数宏、此外,较新版本的 Visual Studio 似乎附带了
long long
、__pragma
、__FUNCTION__
和__restrict
。如果您发现其他 C99 功能对您的工作有用,请告诉我们!我们很少听到 C 用户的声音,所以请大声说出自己的想法-- Arjun Bijanki,微软 ISO C 标准委员会代表http://blogs.msdn.com/b/vcblog/archive/2007/11/05/iso-c-standard-update.aspx
C99 所需的一些标头。
有很多关于特定功能的问题 - 但我不想知道的是:在哪里可以找到当前 MSVC 编译器支持/提供的 C99 功能列表?
我正在寻找一个列表就像 gcc 的列表。
添加了支持
_Bool
类型。
__func__
预定义标识符。
宏是否大于或等于1800的值,以查看是否支持这些功能。 自 MSVC 14.0 (Visual Studio 2015) 以来,
标准库支持已更新且“基本完整”。此版本还添加了 inline
关键字。
restrict
关键字、一致的预处理器和C11支持
出现在 Visual Studio 2019 版本 16.8 中,但这不包括一些在 C11 中可选的强制性 C99 功能。Visual Studio 2022 版本 17.5 添加了对 C11 原子基元和类型 (
stdatomic.h
) 的支持。
早期版本已经支持的功能(我认为至少从 MSVC 7.1 / Visual Studio 2003 开始):
//
long long
灵活的数组成员(微软称它们为“未调整大小的数组”)。
变长数组(C11中可选,未计划)。
_Complex
C11 多线程(可选功能,在路线图上)。
stdint.h
,因为它位于 C++ TR1 草案中。
微软已经明确表示,他们认为市场没有强烈推动在 MSVC 中分配资源来支持 C99,因此几乎可以肯定,您在 MSVC 的 C 编译器模式中看到的 C99 的唯一部分是那些引入的部分,因为C++ 的。令我
感到沮丧的一件事是,长期以来一直属于 C++ 一部分的非库 C99 语言功能在 C 模式下不可用。就我个人而言,如果在编译 C 代码时支持 C99 将语句与声明混合的能力,我会发现它非常有帮助。
但是您今天在 MSVC 中看到的 C 语言功能似乎就是您从这里开始获得的。