Extensões da Microsoft para C e C++
Extensões do Visual C++ para os padrões ANSI C e ANSI C++ são:
Palavras-chave
Microsoft estende a linguagem C++ com várias palavras-chave adicional.Para obter uma lista completa, consulte Palavras-chave C++ no Referência de linguagem C++.As palavras-chave por dois caracteres de sublinhado entrelinhamento são extensões da Microsoft.
De membros de definição de classe de integral const estático (ou enum)
Sob o padrão (/Za), você precisará fazer uma definição de fora da classe para membros de dados. Por exemplo,
class CMyClass {
static const int max = 5;
int m_array[max];
}
...
const int CMyClass::max; // out of class definition
Em /Ze, a definição de fora da classe é opcional para membros de dados estático, const enum integral e const. Somente integrais e enumerações que são estático e const podem ter inicializadores dentro de uma classe; a expressão de inicialização deve ser uma expressão de constante.
Para evitar erros quando uma definição de fora da classe é fornecido (quando a definição de fora da classe é fornecida em um arquivo de cabeçalho e o arquivo de cabeçalho é incluído em vários arquivos de fonte), você deve usar selectany. Por exemplo:
__declspec(selectany) const int CMyClass::max = 5;
Conversões
O compilador oferece suporte as projeções de não-ANSI dois seguintes:
Uso de conversões de não-ANSI para produzir valores l:
char *p; (( int * ) p )++;
O exemplo anterior poderia ser reescrito para estar de acordo com o padrão ANSI C da seguinte maneira:
p = ( char * )(( int * )p + 1 );
Projeção não-ANSI de um ponteiro de função para um ponteiro de dados:
int ( * pfunc ) (); int *pdata; pdata = ( int * ) pfunc;
Para executar a conversão mesma enquanto mantém compatibilidade ANSI, você deve converter o ponteiro de função para um int antes de projeção-lo para um ponteiro de dados:
pdata = ( int * ) (int) pfunc;
Comprimento variável argumento listas
O compilador oferece suporte ao uso de uma função declarador que especifica um número variável de argumentos, seguido por uma definição de função que fornece um tipo em vez disso:
void myfunc( int x, ... );
void myfunc( int x, char * c )
{ }
Comentários de linha única
O compilador C suporta comentários de linha única, que são introduzidos com dois barra / / (/ /) caracteres:
// This is a single-line comment.
Escopo
O compilador C suporta os seguintes recursos relacionados ao escopo:
Redefinições de extern itens sistema autônomo estático:
extern int clip(); static int clip() {}
Uso de redefinições benigno typedef no mesmo escopo:
typedef int INT; typedef int INT;
Função declarators têm escopo do arquivo:
void func1() { extern int func2( double ); } 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 inicializado com expressões nonconstant:
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; }
As definições e declarações de dados
O compilador C suporta os seguintes recursos de declaração e definição de dados:
Constantes de seqüência de caractere e mistos no inicializador de:
char arr[5] = {'a', 'b', "cde"};
Campos de bit com base tipos diferentes de unsigned int ou signed int.
Declarators sem uma classe de armazenamento ou um tipo:
x; int main( void ) { x = 1; }
Unsized arrays sistema autônomo o último campo em estruturas e uniões:
struct zero { char *c; int zarray[]; };
Sem nome estruturas (anônimas):
struct { int i; char *s; };
Sem nome uniões (anônimo):
union { int i; float fl; };
Membros sem nome:
struct s { unsigned int flag : 1; unsigned int : 31; }
Funções intrínsecas de ponto flutuante
O compilador oferece suporte embutido geração x86 específicos > of the atan, atan2, cos, exp, log, log10, sin, sqrt, e tan funções participante x86 específicos Quando /Oi foi especificado. Para C, conformidade com ANSI é perdida quando esses intrinsics são usados, porque eles não defina o errno variável.
Passar um parâmetro de ponteiro não-const para uma função que espera uma referência a um parâmetro de ponteiro const
Isso é uma extensão do C++.O seguinte código será compilado com /Ze:
typedef int T;
const T acT = 9; // A constant of type 'T'
const T* pcT = &acT; // A pointer to a constant of type 'T'
void func2 ( const T*& rpcT ) // A reference to a pointer to a constant of type 'T'
{
rpcT = pcT;
}
T* pT; // A pointer to a 'T'
void func ()
{
func2 ( pT ); // Should be an error, but isn't detected
*pT = 7; // Invalidly overwrites the constant 'acT'
}
ISO646.H não está ativado
Em /Ze, você precisa incluir iso646.h se desejar usar formulários de texto dos operadores a seguir:
&&(e)
&= (and_eq)
&(bitand)
| (bitor)
~ (compl)
!(não)
! = (not_eq)
|| (ou)
| = (or_eq)
^ (xor)
^ = (xor_eq)
Endereço do literal de cadeia de caracteres tem tipo const char [], não const char (*)]
O exemplo a seguir produzirá char const (*) [4] em /Za, mas char const [4] em /Ze.
#include <stdio.h>
#include <typeinfo>
int main()
{
printf_s("%s\n", typeid(&"abc").name());
}