在MS Visual Studio编译器中有哪些C99特性可用?

14 浏览
0 Comments

在MS Visual Studio编译器中有哪些C99特性可用?

众所周知,微软的Visual Studio编译器不支持C99,并且看起来他们没有计划去支持它。然而,该编译器确实包含了一些精选的功能,如可变参数宏和long long。有关这些功能的详细信息,请参阅此答案中的引用:\n“在我们收到许多关于某些C99功能的请求时,我们尽力去实现它们(或相似功能)。一些例子包括可变参数宏、long long、__pragma、__FUNCTION__和__restrict。如果你在工作中发现其他有用的C99功能,请告诉我们!我们很少听到C用户的声音,所以请大胆发言!”——Arjun Bijanki,微软代表ISO C标准委员会\n此外,较新版本的Visual Studio似乎附带了一些C99所需的头文件。\n有很多关于具体功能的问题,但我想知道的是:在当前的MSVC编译器中,我可以在哪里找到支持/提供的C99功能的列表?\n我正在寻找类似于gcc的这个列表。

0
0 Comments

C99特性在MS Visual Studio编译器中的可用性是什么?

C99的非库语言特性中,我认为在MSVC中只支持//注释。除此之外,在C模式下编译时,你将获得的唯一的C99特性是由于微软引入了C99库特性,因为这些特性已经被引入了MS编译器支持的C++标准/草案/技术报告中。例如,在VS 2010中引入了stdint.h,因为它在C++ TR1草案中有所提及。

微软已经明确表示,他们认为市场上没有足够的需求来分配资源支持MSVC中的C99,因此几乎可以确定,你在MSVC的C编译器模式中看到的C99部分将是由于C++的引入。

对我来说,其中令人沮丧的一点是,不在C模式下可用的已经是C++中的C99非库语言特性。就个人而言,如果在编译C代码时能够支持C99中允许在语句中混合声明的能力,将会非常有帮助。

但是似乎你今天在MSVC中看到的C语言特性就是从此以后你将得到的。

谢谢,+1。你是说//注释是仅在Visual Studio中支持的非库C99特性吗?你知道类似于stdint.h这样的库头文件在C模式下是否可用?

"在Visual Studio中支持" - 是的。我会更新问题以澄清这一点。在C模式下,我使用过微软提供的C99库头文件的几次,它们都正常工作。

另一个更新:上面的引用表明,"可变参数宏"和"long long"也在MSVC中支持 - 我忘记了long long。我自己没有使用过可变参数宏,所以我不确定它们在MSVC中是否与C99规定的工作方式相同。引用中提到的其他C99特性__pragma__FUNCTION____restrict类似,但不完全与C99结构相同。要在'可移植'的情况下使用它们可能需要一些烦人的宏魔法来弥合差异(尽管可能是非常小的宏魔法)。

0
0 Comments

随着时间的推移,C99的一些特性逐渐被集成到MS Visual Studio编译器中。然而,在过去,MS Visual Studio编译器并不支持C99的所有特性,这给开发者带来了一些困扰。幸运的是,Microsoft对这个问题的立场发生了变化,并在不同版本的Visual Studio中逐步添加了对C99特性的支持。

首先,在MSVC++ 12.0(Visual Studio 2013的一部分)中,添加了对以下C99特性的支持:

- `_Bool`类型

- 复合字面量

- 指定初始化器

- 声明与代码混合

- `__func__`预定义标识符

开发者可以通过检查`_MSC_VER`宏的值是否大于或等于1800来确定是否支持这些特性。

此外,从MSVC 14.0(Visual Studio 2015)开始,标准库的支持已经得到更新,并且是“大部分完整的”。此版本还添加了`inline`关键字。

在Visual Studio 2019的Release 16.8版本中,添加了`restrict`关键字、符合预处理器和C11支持。但这并不包括在C11中将某些强制性C99特性变为可选的情况。

在Visual Studio 2022的版本17.5中,添加了对C11原子原语和类型(`stdatomic.h`)的支持。

早期版本已经支持的特性包括:

- `//`风格的注释

- `long long`类型

- 可变数组成员(Microsoft称之为“无大小的数组”)

- 可变宏(至少部分支持)

而仍然缺失的特性包括:

- 变长数组(在C11中为可选特性,但没有计划支持)

- `_Complex`类型(在C11中为可选特性,但没有计划支持)

- C11多线程(可选功能,正在路线图中)

需要注意的是,16.8版本支持`restrict`关键字,即使使用C89+部分C99的默认设置。这可能会导致一些混淆,因为在16.8之前的VS2017和VS2019版本不支持该关键字。Microsoft确认,/std:c17启用了对该关键字的支持,但没有告诉您即使没有该选项,也支持该关键字。

最后,通过不断更新和改进,MS Visual Studio编译器逐渐增加了对C99特性的支持,为开发者提供了更多的选择和便利。

0