Visual Studio 2017 не поддерживает новую функцию C11 _Generic

Кто-нибудь может посоветовать, почему 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 ==========

person Marvin Zhang    schedule 22.08.2018    source источник
comment
По-видимому, Microsoft еще не реализовала это в своем компиляторе C.   -  person Jabberwocky    schedule 22.08.2018
comment
В VS 2019 16.8 добавлена ​​поддержка C11 и C17 devblogs.microsoft.com/cppblog/, включая _Generic. С появлением двух новых параметров компилятора, /std:c11 и /std:c17, мы официально поддерживаем последние стандарты языка ISO C.   -  person vulcan raven    schedule 22.12.2020


Ответы (2)


Visual Studio 2017 не поддерживает никаких функций C11. Вы можете подключить компилятор Intel C к Visual Studio (который поддерживает C11) или использовать Clang или Gcc.

Quora ответ:

  • Добавьте в свою Visual Studio встроенную поддержку CLANG.
  • Создать новый проект
  • В свойствах проекта (Общие) для «Набор инструментов платформы» выберите «Visual Studio 2017 — Clang с Microsoft CodeGen (v141_clang_c2)
  • В разделе C/C++ «Язык» откройте список стандартов «Язык C», где вы найдете все стандарты C, актуальные на сегодняшний день L C89, C99, C11 … выберите тот, который вы хотите

После этого (как всегда) VS2017 будет компилировать файлы с расширением «.c» как C и расширением «.cpp» как C++.

Не забывайте, что можно изменить свойства и для каждого файла.

person msc    schedule 22.08.2018
comment
Ну, технически они действительно поддерживают функции C11, поскольку C++17 в некоторых своих вещах уступает C11. Однако от компиляторов, совместимых с C++17, требуется только поддержка определенных функций из библиотеки C11, и общие макросы ею не охвачены. - person paxdiablo; 22.08.2018

Это связано с тем, что Microsoft никогда не уделяла приоритетное внимание соответствию стандарту языка C. За последние 20 лет или около того их основное внимание уделялось C++. Таким образом, Visual Studio следует рассматривать как компилятор C++.

В «режиме C» он по-прежнему имеет сомнительное соответствие первому стандарту C C90. Им потребовалась целая вечность, чтобы попытаться добиться соответствия C99, они приложили некоторые усилия для этого только в последние годы. Он по-прежнему не полностью совместим с C99. Насколько я знаю, нет никаких планов по соответствию C11 или C17.

Поэтому, если для вас важно соответствие стандарту, вам следует поискать другой компилятор C.

person Lundin    schedule 22.08.2018
comment
Спасибо за ваш ответ. Это полезно для меня. - person Marvin Zhang; 22.08.2018
comment
Кажется, я припоминаю, что MS довольно часто давала понять, что, хотя их продукт начинался как компилятор C/C++, теперь он ориентирован на C++. Это означает, что им нужно поддерживать только то, что требуется стандартом C++ (включая некоторые функции library из C11). Это естественно, что они лишают приоритета то, что не нужно. - person paxdiablo; 22.08.2018
comment
@paxdiablo И все же эти библиотеки не совместимы с C ++. Например, они не поддерживают все спецификаторы формата, требуемые std::printf/cstdio. - person Lundin; 22.08.2018
comment
Без сомнений. blogs.msdn .microsoft.com/vcblog/2018/05/07/ — думаю, определение слова «соответствовать» Microsoft немного отличается от моего :-) - person paxdiablo; 22.08.2018
comment
Понимание Microsoft соответствия, несомненно, заключается в том, что Microsoft пытается заставить мир соответствовать им. - person Antti Haapala; 22.08.2018
comment
C++11–C++20 поддерживаются в последних версиях набора инструментов MSVC. C11 и C17 добавлены в VS 2019. Ознакомьтесь с таблицей соответствия: docs.microsoft.com/en-us/cpp/overview/. - person vulcan raven; 23.12.2020