Поделиться через


Расширения Майкрософт для языков 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, log10expcossinsqrtlogtan и функции при /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