Visual Studio 2017不支持C11的新特性_Generic。

5

有人可以解释一下为什么Visual Studio 2017不支持C11的新特性_Generic吗?我发现这是一个非常有用的功能,但在Visual Studio 2017中无法使用。

以下是示例代码:

#include <stdio.h>
#define MYTYPE(X) _Generic((X),\
int:"int",\
float:"float",\
double:"double",\
default:"other")

int main(void)
{
      int d = 5;
      printf("%s\n", MYTYPE(d));
      printf("%s\n", MYTYPE(2.0*D));
      return 0;
}

编译器会给出以下警告和错误提示:
1>------ Build started: Project: Project1, Configuration: Debug Win32 ------
1>predef.c
1>c:\users\mia\documents\c\listing 16.13\project1\project1\predef.c(11): warning C4013: '_Generic' undefined; assuming extern returning int
1>c:\users\mia\documents\c\listing 16.13\project1\project1\predef.c(11): error C2059: syntax error: 'type'
1>c:\users\mia\documents\c\listing 16.13\project1\project1\predef.c(12): error C2065: 'D': undeclared identifier
1>c:\users\mia\documents\c\listing 16.13\project1\project1\predef.c(12): error C2059: syntax error: 'type'
1>Done building project "Project1.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

1
显然,微软尚未在其C编译器中实现此功能。 - Jabberwocky
VS 2019 16.8已经增加了C11和C17支持,包括_Generic。"随着两个新的编译器开关/ std:c11和/ std:c17的出现,我们正式支持最新的ISO C语言标准。" https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/ - vulcan raven
2个回答

10
Visual Studio 2017不支持任何C11特性。您可以将Intel C编译器插入Visual Studio(支持C11),或使用Clang或Gcc。 Quora答案:
  • 为您的Visual Studio添加内置的CLANG支持
  • 创建新项目
  • 在项目属性(常规)中,对于“平台工具集”,请选择“Visual Studio 2017 - Clang with Microsoft CodeGen(v141_clang_c2)”
  • 在C / C ++“语言”部分打开“C语言”标准列表,您将找到所有与今天相关的C标准L C89,C99,C11 …选择您希望的标准

此后(与以往一样),VS2017将将扩展名为“.c”的文件编译为C,将扩展名为“.cpp”的文件编译为C ++。
不要忘记,您也可以按文件基础上更改属性。

1
从技术上讲,自C++17起,它支持C11的某些功能。然而,符合C++17标准的编译器只需要支持C11库中的某些特定功能,并且通用宏不在其中。 - paxdiablo

7
这是因为微软从来没有把符合 C 语言标准放在首要位置,过去20年左右,他们的主要重点一直是放在 C++ 上。因此,Visual Studio 应被视为一个 C++ 编译器。
在“C 模式”下,它仍然对第一个 C 标准 C90 的合规性存在疑问。他们花费了很长时间才尝试达到 C99 合规性,在最近几年里进行了一些努力。它还不完全符合 C99。据我所知,没有计划符合 C11 或 C17。
因此,如果符合标准至关重要,您必须寻找其他 C 编译器。

谢谢您的回复。对我很有帮助。 - Marvin Zhang
我记得微软经常明确表示,尽管他们的产品最初是“C/C++编译器”,但现在它专注于C++。这意味着他们只需要支持C++标准所需的内容(包括来自C11的某些库功能)。他们自然会降低不必要的C语言相关内容的优先级。 - paxdiablo
@paxdiablo,然而这些库不符合C++标准。例如,它们不支持std::printf/cstdio所需的所有格式说明符。 - Lundin
毫无疑问。https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/ - 猜测微软对“符合”这个词的定义与我的略有不同 :-) - paxdiablo
微软对符合标准的理解无疑是微软试图让世界符合他们的标准。 - Antti Haapala -- Слава Україні
MSVC工具链的最近版本支持C++11到C++20。C11和C17已经在VS 2019中添加。请查看符合性表格:https://learn.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance。 - vulcan raven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接