Condividi tramite


Estensioni Microsoft per C e C++

Microsoft Visual C++ (MSVC) estende gli standard del linguaggio C e C++ in diversi modi, descritti in dettaglio in questo articolo.

Per impostazione predefinita, il compilatore MSVC C++ supporta il supporto per ISO C++14 con alcune funzionalità ISO C++17 e alcune estensioni del linguaggio specifiche di Microsoft. Per altre informazioni sulle funzionalità supportate, vedere Conformità del linguaggio Microsoft C/C++ in base alla versione di Visual Studio. È possibile usare l'opzione del /std compilatore per abilitare il supporto completo per le funzionalità del linguaggio ISO C++17 e ISO C++20. Per altre informazioni, vedere /std (Specificare la versione standard della lingua) .

Se specificato, alcune estensioni del linguaggio C++ MSVC possono essere disabilitate tramite l'opzione del /Za compilatore. In Visual Studio 2017 e versioni successive, l'opzione del /permissive- compilatore disabilita le estensioni del linguaggio C++ specifiche di Microsoft. L'opzione /permissive- del compilatore è abilitata in modo implicito dalle opzioni del /std:c++20 compilatore e /std:c++latest .

Per impostazione predefinita, quando MSVC compila il codice come C, implementa ANSI C89 con estensioni del linguaggio specifiche di Microsoft. Alcune di queste estensioni MSVC sono standardizzate in ISO C99 e versioni successive. La maggior parte delle estensioni C MSVC può essere disabilitata tramite l'opzione del /Za compilatore, come descritto più avanti in questo articolo. È possibile usare l'opzione del compilatore per abilitare il /std supporto per ISO C11 e C17. Per altre informazioni, vedere /std (Specificare la versione standard della lingua) .

La libreria di runtime C standard viene implementata dalla libreria di runtime UWP (Universal C Runtime Library) in Windows. UCRT implementa anche molte estensioni di libreria specifiche di Microsoft e POSIX. UCRT supporta gli standard della libreria di runtime C11 e C17 ISO, con alcune avvertenze specifiche dell'implementazione. Non supporta la libreria di runtime C standard ISO C99 completa. Per altre informazioni, vedere compatibilità nella documentazione della libreria di runtime di Universal C.

Parole chiave

MSVC aggiunge diverse parole chiave specifiche di Microsoft a C e C++. Nell'elenco in Parole chiave le parole chiave con due caratteri di sottolineatura iniziali sono estensioni MSVC.

Cast

Sia il compilatore C++ che il compilatore C supportano questi tipi di cast non standard:

  • Il compilatore C supporta cast non standard per produrre l-values. Ad esempio:

    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
    

    Nota

    Questa estensione è disponibile solo nel linguaggio C. È possibile usare il formato C standard seguente nel codice C++ per modificare un puntatore come se fosse un puntatore a un tipo diverso.

    L'esempio precedente può essere riscritto come segue per essere conforme allo standard C.

    p = ( char * )(( int * )p + 1 );
    
  • Sia i compilatori C che C++ supportano cast non standard di un puntatore a funzione a un puntatore a dati. Ad esempio:

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

Elenchi di argomenti a lunghezza variabile

I compilatori C e C++ supportano un dichiaratore di funzione che specifica un numero variabile di argomenti, seguito da una definizione di funzione che fornisce invece un 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.

Commenti a riga singola

Il compilatore C supporta i commenti a riga singola, introdotti usando due caratteri barra (//):

// This is a single-line comment.

I commenti a riga singola sono una funzionalità C99. Non sono interessati da /Za e non causano alcuna diagnostica a alcun livello.

Ambito

Il compilatore C supporta le seguenti funzionalità relative all'ambito.

  • Ridefinizioni di extern elementi come 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 di ridefinizioni typedef non dannose all'interno dello stesso ambito:

    typedef int INT;
    typedef int INT; // No diagnostic at any level in C or C++
    
  • I dichiaratori di funzione hanno un ambito di file:

    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 di variabili di ambito di blocco inizializzate tramite espressioni non costanti:

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

Dichiarazioni e definizioni di dati

Il compilatore C supporta le seguenti funzionalità di dichiarazione e definizione dei dati.

  • Costanti di caratteri e stringhe miste in un inizializzatore:

    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
    
  • Campi di bit con tipi di base diversi da unsigned int o signed int.

  • Dichiaratori che non dispongono di un 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;
    }
    
  • Matrici non ridimensionate come ultimo campo nelle strutture e nelle unioni:

    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
    };
    
  • Strutture senza nome (anonimo):

    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'
    
  • Unioni senza nome (anonimo):

    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'
    

Funzioni a virgola mobile intrinseche

Sia il compilatore X86 C++ che il compilatore C supportano la atangenerazione inline delle funzioni , sinlogcosatan2log10sqrtexpe tan quando /Oi viene specificato . Queste funzioni intrinseche non sono conformi allo standard, perché non impostano la errno variabile.

ISO646.H non abilitato

In /Zeè necessario includere iso646.h se si desidera utilizzare forme di testo degli operatori seguenti:

Operatore Modulo di testo
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq

Questi moduli di testo sono disponibili come parole chiave C++ in /Za o quando /permissive- è specificato o implicito.

Vedi anche

/Za, /Ze (Disabilita estensioni del linguaggio)
Opzioni del compilatore MSVC
Sintassi della riga di comando del compilatore MSVC