2011-10-13 18 views
24

Perché si tratta di un avviso? Penso che ci siano molti casi in cui è più chiaro usare costanti multi-char int invece di numeri "senza significato" o invece di definire variabili const con lo stesso valore. Quando si analizzano wave/tiff/altri tipi di file è più chiaro confrontare i valori letti con alcuni "EVAW", "data", ecc. Anziché i loro valori corrispondenti.Avvisi costanti multi-carattere

codice di esempio:

int waveHeader = 'EVAW'; 

Perché questo dà un avvertimento?

+0

Ho problemi a cercare di capire la tua domanda. Puoi renderlo più chiaro? –

+0

@ 0A0D Proverò :) Scusa – Felics

+0

Correlati: http: // stackoverflow.it/questions/7497192/enum-constants-questions –

risposta

28

According to the standard (§6.4.4.4/10)

Il valore di una costante carattere intero contenente più di un carattere (per esempio, 'ab'), [...] dipende dall'implementazione.

long x = '\xde\xad\xbe\xef'; // yes, single quotes 

Questo è valido ISO 9899: 2011 C. compila senza preavviso sotto gcc con -Wall, e un “carattere multi-carattere costante” avvertimento con -pedantic.

Da Wikipedia:

costanti Multi-carattere (ad esempio 'xy') sono validi, anche se raramente utili - hanno lasciato un negozio diversi personaggi in un numero intero (ad esempio 4 caratteri ASCII può andare bene in un Numero intero a 32 bit, 8 in uno a 64 bit). Poiché l'ordine in cui i caratteri sono impacchettati in un int non è specificato, l'uso portatile di costanti a più caratteri è difficile.

Per motivi di portabilità, non utilizzare costanti a più caratteri con tipi interi.

+3

Non sono sicuro di cosa significhi quell'ultima frase; le costanti multi-carattere hanno sempre tipi interi (e tali costanti senza prefisso hanno sempre il tipo 'int'). –

12

Questo avviso è utile per i programmatori che scriverebbero erroneamente 'test' dove avrebbero dovuto scrivere "test".

Questo accade molto più spesso dei programmatori che vogliono effettivamente costanti int per più caratteri.

+2

Questo è un buon esempio, ma cosa succede quando voglio veramente scrivere 'test' e ho un avvertimento. Non lascio alcun avvertimento nel mio codice ... – Felics

+0

Devi far fronte all'avviso, o trovare l'opzione del compilatore per disabilitare questo avvertimento specifico (che potrebbe ferirti in qualche altro posto nel tuo codice ;-)). –

+1

Un altro errore programmatore accidentale consiste nel ricordare erroneamente la sintassi per le fughe esadecimali e scrivere '\ 0x61' quando si intendeva '\ x61'. – tml

11

Se sei felice di sapere che cosa si sta facendo e può accettare i problemi di portabilità, il GCC per esempio è possibile disattivare l'avviso sulla riga di comando:

-Wno-multichar 

Io lo uso per il mio app per lavorare con le intestazioni di file AVI e MP4 per ragioni simili a voi.

3

Anche se si è disposti a cercare quale comportamento definisce la propria implementazione, le costanti multi-carattere saranno con variabili con endianness.

Meglio utilizzare una struttura (POD) {char [4]}; ... e quindi utilizzare un UDL come "WAVE" _4cc per creare facilmente istanze di quella classe