Расширения Майкрософт для языков C и C++
Microsoft Visual C++ (MSVC) расширяет языковые стандарты C и C++ несколькими способами, подробно описанными в этой статье.
Компилятор MSVC C++ по умолчанию поддерживает iso C++14 с некоторыми функциями ISO C++17 и некоторыми расширениями языка, зависящими от Майкрософт. Дополнительные сведения о поддерживаемых функциях см. в статье о соответствии языка Microsoft C/C++ версии Visual Studio. Вы можете использовать параметр компилятора /std
, чтобы включить полную поддержку функций языка ISO C++17 и ISO C++20. Дополнительные сведения см. в разделе /std
(Указание стандартной версии языка).
Где указано, некоторые расширения языка MSVC C++ можно отключить с помощью параметра компилятора /Za
. В Visual Studio 2017 и более поздних версиях /permissive-
параметр компилятора отключает расширения языка C++ для конкретного Майкрософт. Параметр /permissive-
компилятора неявно включен /std:c++20
параметрами компилятора и /std:c++latest
компилятора.
По умолчанию, когда MSVC компилирует код как C, он реализует ANSI C89 с расширениями языка, зависящими от Майкрософт. Некоторые из этих расширений MSVC стандартизированы в ISO C99 и более поздних версиях. Большинство расширений MSVC C можно отключить с помощью параметра компилятора /Za
, как описано далее в этой статье. Вы можете использовать параметр компилятора /std
, чтобы включить поддержку ISO C11 и C17. Дополнительные сведения см. в разделе /std
(Указание стандартной версии языка).
Стандартная библиотека среды выполнения C реализуется универсальной библиотекой среды выполнения C (UCRT) в Windows. UCRT также реализует множество расширений библиотеки POSIX и Майкрософт. UCRT поддерживает стандарты библиотеки среды выполнения ISO C11 и C17 C с определенными предостережениями, характерными для реализации. Она не поддерживает полную библиотеку среды выполнения C стандарта ISO C99. Дополнительные сведения см . в документации по библиотеке среды выполнения Universal C.
Ключевые слова
MSVC добавляет несколько ключевых слов, определенных корпорацией Майкрософт, в C и C++. В списке ключевых слов ключевые слова, имеющие два ведущих подчеркивания, — это расширения MSVC.
Приведения
Компилятор C++ и компилятор C поддерживают такие нестандартные приведения:
Компилятор C поддерживает нестандартные приведения для создания l-значений. Рассмотрим пример.
char *p; (( int * ) p )++; // In C with /W4, both by default and under /Ze: // warning C4213: nonstandard extension used: cast on l-value // Under /TP or /Za: // error C2105: '++' needs l-value
Примечание.
Это расширение доступно только на языке C. Для изменения указателя можно использовать следующую стандартную форму C++ в коде C++, как если бы это указатель на другой тип.
Приведенный выше пример может быть перезаписан следующим образом, чтобы соответствовать стандарту C.
p = ( char * )(( int * )p + 1 );
Компиляторы C и C++ поддерживают нестандартные приведения указателя функции на указатель данных. Например:
int ( * pfunc ) (); int *pdata; pdata = ( int * ) pfunc; /* No diagnostic at any level, whether compiled with default options or under /Za */
Списки аргументов переменной длины
Компиляторы C и C++ поддерживают декларатор функции, указывающий переменное число аргументов, за которым следует определение функции, которое предоставляет тип.
void myfunc( int x, ... );
void myfunc( int x, char * c )
{ }
// In C with /W4, either by default or under /Ze:
// warning C4212: nonstandard extension used: function declaration used ellipsis
// In C with /W4, under /Za:
// warning C4028: formal parameter 2 different from declaration
// In C++, no diagnostic by default or under /Za.
Однострочные комментарии
Компилятор C поддерживает одно строковый комментарий, которые представлены с помощью двух символов косой черты (//
).
// This is a single-line comment.
Одно строковый комментарий — это функция C99. Они не затронуты /Za
и не вызывают диагностики на любом уровне.
Область
Компилятор C поддерживает следующие функции, связанные с областью.
Переопределение
extern
элементов в видеstatic
:extern int clip(); static int clip() {} // In C and C++ with /W4, either by default or under /Ze: // warning C4211: nonstandard extension used: redefined extern to static // In C and C++ under /Za: // error C2375: 'clip': redefinition; different linkage
Использование доброкачественных переопределений typedef в той же области:
typedef int INT; typedef int INT; // No diagnostic at any level in C or C++
Деклараторы функций имеют область файла:
void func1() { extern double func2( double ); // In C at /W4: warning C4210: nonstandard extension used: function given file scope } int main( void ) { func2( 4 ); // /Ze passes 4 as type double } // /Za passes 4 as type int
Использование переменных области блоков, инициализируемых с помощью неконстантных выражений:
int clip( int ); int bar( int ); int main( void ) { int array[2] = { clip( 2 ), bar( 4 ) }; } int clip( int x ) { return x; } int bar( int x ) { return x; }
Объявления и определения данных
Компилятор C поддерживает следующие функции объявления и определения данных.
Смешанные константы символов и строк в инициализаторе:
char arr[6] = {'a', 'b', "cde"}; // In C with /W4, either by default or under /Ze: // warning C4207: nonstandard extension used: extended initializer form // Under /Za: // error C2078: too many initializers
Битовые поля, имеющие базовые типы, отличные
unsigned int
от илиsigned int
.Деклараторы, у которых нет типа:
x; // By default or under /Ze, /Za, /std:c11, and /std:c17, when /W4 is specified: // warning C4431: missing type specifier - int assumed. Note: C no longer supports default-int // warning C4218: nonstandard extension used: must specify at least a storage class or a type */ int main( void ) { x = 1; }
Неструктурированные массивы в качестве последнего поля в структурах и объединениях:
struct zero { char *c; int zarray[]; // In C with /W4, either by default, under /Ze, /std:c11, and /std:c17: // warning C4200: nonstandard extension used: zero-sized array in struct/union // Under /Za: // error C2133: 'zarray': unknown size };
Неименованные (анонимные) структуры:
struct { int i; char *s; }; // By default or under /Ze, /std:c11, and /std:c17, when /W4 is specified: // warning C4094: untagged 'struct' declared no symbols // Under /Za: // error C2059: syntax error: 'empty declaration'
Неименованные (анонимные) профсоюзы:
union { int i; float fl; }; // By default or under /Ze, /std:c11, and /std:c17, when /W4 is specified: // warning C4094: untagged 'union' declared no symbols // Under /Za: // error C2059: syntax error: 'empty declaration'
Встроенные функции с плавающей запятой
Компилятор x86 C++ и компилятор C поддерживают встроенное поколение atan
, atan2
, log10
exp
cos
sin
sqrt
log
tan
и функции при /Oi
указании. Эти встроенные компоненты не соответствуют стандарту, так как они не задают errno
переменную.
ISO646.H
не включен
В разделе /Ze
необходимо включить iso646.h
, если вы хотите использовать текстовые формы следующих операторов:
Оператор | Форма текста |
---|---|
&& |
and |
&= |
and_eq |
& |
bitand |
| |
bitor |
~ |
compl |
! |
not |
!= |
not_eq |
|| |
or |
|= |
or_eq |
^ |
xor |
^= |
xor_eq |
Эти текстовые формы доступны как ключевые слова C++ или /Za
когда /permissive-
они указаны или подразумеваются.
См. также
/Za
, /Ze
(Отключение расширений языка)
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC