Domanda

Quanto è universalmente supportato lo standard C99 nei compilatori di oggi? Capisco che nemmeno GCC lo supporta pienamente. È giusto?

Quali funzioni di C99 sono supportate più di altre, ovvero quali posso usare per essere abbastanza sicuro che la maggior parte dei compilatori mi capirà?

È stato utile?

Soluzione

Se vuoi scrivere un codice C portatile, ti suggerisco di scrivere in C89 (vecchio standard ANSI C). Questo standard è supportato dalla maggior parte dei compilatori.

Il compilatore Intel C ha molto buono Supporto C99 e produce file binari veloci. (Grazie 0x69 !)

MSVC supporta alcune nuove funzionalità e Microsoft prevede di ampliare il supporto nelle versioni future.

GCC supporta alcune novità di C99. Hanno creato una tabella sullo stato delle funzionalità C99 . Probabilmente la caratteristica più utilizzabile di C99 è l'array a lunghezza variabile e GCC ora lo supporta. Clang (facciata C di LLVM) supporta la maggior parte delle funzionalità tranne pragmi in virgola mobile. p>

Wikipedia sembra avere un bel riassunto del supporto C99 dei compilatori.

Altri suggerimenti

Qualcuno ha menzionato che il compilatore Intel ha il supporto C99. Esiste anche il compilatore Comeau C / C ++ che supporta pienamente C99. Questi sono gli unici di cui sono a conoscenza.

Le funzionalità C99 che non utilizzo perché non ben supportate includono:

  • array a lunghezza variabile
  • macro con numero variabile di parametri.

Funzionalità C99 che utilizzo regolarmente che sembrano abbastanza ben supportate (tranne che da Microsoft):

  • stdint.h
  • snprintf () - MS ha un _snprintf () non standard che ha serie limitazioni a non sempre terminare il buffer in modo nullo e non indicare la dimensione del buffer

Per aggirare il non supporto di Microsoft, utilizzo un dominio pubblico stdint.h da MinGW (che ho modificato per funzionare anche su VC6) e un quasi pubblico dominio snprintf () da Holger Weiss

Gli elementi che non sono supportati da Microsoft, ma che verranno comunque utilizzati su altri compilatori a seconda del progetto includono:

  • dichiarazioni e codici misti
  • funzioni in linea
  • _Pragma () - questo rende i pragmi molto più utilizzabili

Per gcc, esiste una con tutte le funzionalità supportate . Sembra che la cosa più grande che manca siano le matrici di lunghezza variabile. La maggior parte delle altre funzioni mancanti sono problemi di libreria piuttosto che di lingua.

Il compilatore c IBM ha il supporto c99 quando viene invocato come c99 ma non quando viene richiamato come cc o xlc.

Guarda Stato del supporto C99 per GNU per dettagli su quali funzionalità sono attualmente supportate.

Sun Studio è presunto supportare l'intera specifica C99. Non li ho mai usati, quindi non posso confermare.

Non credo che il compilatore Microsoft supporti le specifiche C99 nella sua interezza. Al momento sono molto più focalizzati sul C ++

Clang (il compilatore C e C ++ basato su LLVM) ha un supporto C99 abbastanza buono. Penso che l'unica cosa che non supporti siano i pragmi in virgola mobile.

Sembra che Microsoft stia monitorando gli standard C ++, ma non ha supporto per C99. (Potrebbero scegliere alcune funzionalità, ma si potrebbe dire che stia selezionando C ++ 0x dove c'è una sovrapposizione.)

A partire da Visual Studio .NET 2003, i nuovi progetti hanno l'opzione 'Compila codice C come C ++ (/ TP)' abilitata per impostazione predefinita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top