Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Microsoft C++ (MSVC) estende os padrões de linguagem C e C++ de várias maneiras, detalhado neste artigo.
O compilador MSVC C++ assume como padrão o suporte para ISO C++14 com alguns recursos ISO C++17 e algumas extensões de linguagem específicas da Microsoft. Para obter mais informações sobre os recursos suportados, consulte Microsoft C/C++ language conformance by Visual Studio version. Você pode usar a opção de compilador para habilitar o /std suporte total para os recursos de linguagem ISO C++17 e ISO C++20. Para obter mais informações, consulte /std (Especificar versão padrão do idioma).
Quando especificado, algumas extensões de linguagem MSVC C++ podem ser desabilitadas usando a /Za opção de compilador. No Visual Studio 2017 e versões posteriores, a /permissive- opção de compilador desabilita extensões de linguagem C++ específicas da Microsoft. A /permissive- opção do compilador é implicitamente habilitada pelas opções e /std:c++latest do /std:c++20 compilador.
Por padrão, quando o MSVC compila código como C, ele implementa ANSI C89 com extensões de linguagem específicas da Microsoft. Algumas dessas extensões MSVC são padronizadas na ISO C99 e posteriores. A maioria das extensões MSVC C pode ser desativada usando a /Za opção de compilador, conforme detalhado mais adiante neste artigo. Você pode usar a opção de compilador para habilitar o /std suporte para ISO C11 e C17. Para obter mais informações, consulte /std (Especificar versão padrão do idioma).
A biblioteca de tempo de execução C padrão é implementada pela Universal C runtime library (UCRT) no Windows. O UCRT também implementa muitas extensões de biblioteca específicas do POSIX e da Microsoft. O UCRT suporta os padrões de biblioteca de tempo de execução ISO C11 e C17 C, com certas ressalvas específicas de implementação. Ele não suporta a biblioteca de tempo de execução C padrão ISO C99 completa. Para obter mais informações , consulte compatibilidade na documentação da biblioteca de tempo de execução Universal C.
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 que têm dois sublinhados principais são extensões MSVC.
Moldes
Tanto o compilador C++ quanto o compilador C suportam esses tipos de casts não padrão:
O compilador C suporta casts 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-valueObservação
Esta extensão está disponível apenas no idioma C. Você pode 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 pode ser reescrito da seguinte forma para estar em conformidade com a norma C.
p = ( char * )(( int * )p + 1 );Os compiladores C e C++ suportam transmissões não padrão de um ponteiro de função para um ponteiro 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
Os compiladores C e C++ suportam 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 linha única
O compilador C suporta comentários de linha única, que são introduzidos usando dois caracteres de barra (//):
// This is a single-line comment.
Comentários de linha única são um recurso C99. Eles não são afetados /Za e não causam diagnóstico em nenhum nível.
Scope
O compilador C suporta os seguintes recursos relacionados ao escopo.
Redefinições de
externitens comostatic: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 linkageUtilização de redefinições benignas de typedef no mesmo âmbito:
typedef int INT; typedef int INT; // No diagnostic at any level in C or C++Os 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 intUso 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 de dados e definições
O compilador C suporta os seguintes recursos de declaração e definição de dados.
Constantes mistas de caracteres e cadeias 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 initializersCampos de bits com tipos de base diferentes de
unsigned intousigned 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 dimensionadas 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 sem nome (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'Sindicatos sem nome (anónimos):
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 intrínsecas de ponto flutuante
Tanto o compilador C++ x86 quanto o compilador C suportam a atangeração em linha das funções , atan2, cos, exp, log, sinlog10, sqrt, e tan quando /Oi especificado. Estes intrínsecos não estão de acordo com o padrão, porque não definem a errno variável.
ISO646.H não ativado
Em /Ze, você precisa incluir iso646.h se quiser usar formulários de texto dos seguintes operadores:
| Operator | Formulário de texto |
|---|---|
&& |
and |
&= |
and_eq |
& |
bitand |
| |
bitor |
~ |
compl |
! |
not |
!= |
not_eq |
|| |
or |
|= |
or_eq |
^ |
xor |
^= |
xor_eq |
Esses formulários de texto estão disponíveis como palavras-chave C++ em /Za ou quando /permissive- é especificado ou implícito.
Consulte também
/Za, /Ze (Desativar extensões de idioma)
opções do compilador MSVC
de sintaxe de linha de comando do compilador MSVC