Partilhar via


Extensões da Microsoft para C e C++

O MSVC (Microsoft Visual C++) estende os padrões de linguagem C e C++ de várias maneiras, detalhadas neste artigo.

O compilador do MSVC C++ tem como padrão o suporte para ISO C++14 com alguns recursos de ISO C++17 e algumas extensões de linguagem específicas da Microsoft. Para obter mais informações sobre recursos com suporte, consulte Conformidade de linguagem do Microsoft C/C++ por versão do Visual Studio. É possível usar a opção do compilador /std para habilitar o suporte completo a recursos de linguagem ISO C++17 e ISO C++20. Para obter mais informações, veja /std (especificar a versão de linguagem padrão).

Onde especificadas, algumas extensões de linguagem do MSVC C++ poderão ser desabilitadas pelo uso da opção do compilador /Za. No Visual Studio 2017 e versões posteriores, a opção do compilador /permissive- desabilita as extensões de linguagem C++ específicas da Microsoft. A opção do compilador /permissive- é habilitada implicitamente pelas opções do compilador /std:c++20 e /std:c++latest.

Por padrão, quando o MSVC compila o código como C, ele implementa o ANSI C89 com extensões de linguagem específicas da Microsoft. Algumas dessas extensões do MSVC são padronizadas no ISO C99 e posterior. A maioria das extensões do MSVC C pode ser desabilitada usando a opção do compilador /Za, conforme detalhado posteriormente neste artigo. É possível usar a opção do compilador /std para habilitar o suporte para ISO C11 e C17. Para obter mais informações, veja /std (especificar a versão de linguagem padrão).

A biblioteca de runtime C padrão é implementada pela biblioteca de runtime C Universal (UCRT) no Windows. UCRT também implementa muitas extensões de biblioteca específicas da Microsoft e POSIX. UCRT dá suporte a padrões de biblioteca de runtime ISO C11 e C17 C, com determinadas restrições específicas de implementação. Não há suporte para biblioteca de runtime C padrão ISO C99 completa. Para obter mais informações, consulte compatibilidade na documentação da biblioteca de runtime C Universal.

Palavras-chave

O MSVC adiciona várias palavras-chave específicas da Microsoft a C e C++. Na lista em Palavras-chave, as palavras-chave com dois sublinhados à esquerda são extensões do MSVC.

Conversões

Ambos os compiladores C++ e C dão suporte a esses tipos de conversões não padrão:

  • O compilador C dá suporte a conversões não padrão para produzir valores-l. Por exemplo:

    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
    

    Observação

    Essa extensão está disponível apenas na linguagem C. É possível usar o seguinte formulário padrão C no código C++ para modificar um ponteiro como se fosse um ponteiro para um tipo diferente.

    O exemplo anterior poderá ser reescrito da seguinte forma para estar em conformidade com o padrão C.

    p = ( char * )(( int * )p + 1 );
    
  • Ambos os compiladores C e C++ dão suporte a conversões não padrão de um ponteiro de função para um ponto de dados. Por exemplo:

    int ( * pfunc ) ();
    int *pdata;
    pdata = ( int * ) pfunc;
    /* No diagnostic at any level, whether compiled with default options or under /Za */
    

Listas de argumentos de comprimento variável

Ambos os compiladores C e C++ dão suporte a um declarador de função que especifica um número variável de argumentos, seguido por uma definição de função que fornece um tipo:

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.

Comentários de única linha

O compilador C dá suporte a comentários de linha única, que são introduzidos usando dois caracteres de barra (//):

// This is a single-line comment.

Comentários de linha simples são um recurso do C99. Eles não são afetados por /Za e não causam diagnóstico em nenhum nível.

Escopo

O compilador C dá suporte aos seguintes recursos relacionados ao escopo.

  • Redefinições de itens extern como 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
    
  • Uso de redefinições de typedef benigno no mesmo escopo:

    typedef int INT;
    typedef int INT; // No diagnostic at any level in C or C++
    
  • Declaradores de função têm escopo de arquivo:

    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
    
  • Uso de variáveis de escopo de bloco que são inicializadas usando expressões não constantes:

    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;
    }
    

Declarações e definições de dados

O compilador C dá suporte aos seguintes recursos de definição e declaração de dados.

  • Caracteres mistos e constantes de cadeia de caracteres em um inicializador:

    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
    
  • Campos de bits com tipos base diferentes de unsigned int ou signed int.

  • Declaradores que não têm um tipo:

    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;
    }
    
  • Matrizes não dimensionados como o último campo em estruturas e uniões:

    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
    };
    
  • Estruturas não nomeadas (anônimas):

    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'
    
  • Uniões não nomeadas (anônimas):

    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'
    

Funções de ponto flutuante intrínsecas

O compilador x86 C++ e o compilador C dão suporte à geração embutida das funções atan, atan2, cos, exp, log, log10, sin, sqrt e tan quando /Oi é especificado. Esses intrínsecas não estão em conformidade com o padrão porque não definem a variável errno.

ISO646.H não habilitado

Em /Ze, será necessário incluir iso646.h se quiser usar fomulários de texto dos seguintes operadores:

Operador Formulário de texto
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq

Esses formulários de texto estarão disponíveis como palavras-chave de C++ em /Za ou quando /permissive- estiver especificado ou implícito.

Confira também

/Za, /Ze (Desabilitar extensões de linguagem)
Opções do compilador MSVC
Sintaxe de linha de comando do compilador MSVC