Flag del compilatore C per ignorare il segno
-
20-09-2019 - |
Domanda
Attualmente mi sto occupando del codice acquistato da un appaltatore di terze parti.Una struttura ha un campo di caratteri senza segno mentre la funzione a cui stanno passando quel campo richiede un carattere con segno.Al compilatore questo non piace, poiché li considera tipi non corrispondenti.Tuttavia, a quanto pare viene compilato per quell'appaltatore.Alcuni Google mi hanno detto che "[i]t è definito dall'implementazione se un oggetto char può contenere valori negativi".Il compilatore dell'appaltatore potrebbe sostanzialmente ignorare il tipo firmato/non firmato e trattarli allo stesso modo?Oppure esiste un flag del compilatore che li tratterà allo stesso modo?
Il C non è il mio linguaggio più forte, basta guardare i miei tag sulla mia pagina utente, quindi qualsiasi aiuto sarebbe molto apprezzato.
Soluzione
In realtà char
, signed char
E unsigned char
sono tre tipi diversi.Dalla norma (ISO/IEC 9899:1990):
6.1.2.5 Tipi
...
I tre tipi car, firmato car E carattere non firmato sono chiamati collettivamente il tipi di carattere.
(e in C++, ad esempio, devi (o almeno dovresti) scrivere funzioni di override con tre varianti se hai un argomento char)
Il carattere semplice potrebbe essere trattato con segno o senza segno dal compilatore, ma lo standard dice (anche in 6.1.2.5):
Un oggetto dichiarato come tipo car è abbastanza grande per memorizzare qualsiasi membro di l'insieme di caratteri di esecuzione di base.Se un membro della fonte richiesta set di caratteri di cui al punto 5.2.1 è memorizzato in car oggetto, il suo valore è garantito per essere positivi.Se altre quantità sono immagazzinati in un car oggetto, il il comportamento è definito dall'implementazione:i valori sono trattati come: interi firmati o non negativi.
E
Un oggetto dichiarato come tipo Signed char occupa la stessa quantità di spazio di archiviazione di un ''plain'' car oggetto.
I caratteri di cui al punto 5.2.1 sono A-Z, a-z, 0-9, spazio, tab, newline e i seguenti 29 caratteri grafici:
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
Risposta
Tutto ciò lo interpreto sostanzialmente nel senso che i caratteri ASCII con valore inferiore a 128 sono garantiti come positivi.Pertanto, se i valori archiviati sono sempre inferiori a 128, dovrebbe essere sicuro (dal punto di vista della conservazione del valore), sebbene non sia una buona pratica.
Altri suggerimenti
Questo è il compilatore-dipendente. Ad esempio, in VC ++ c'è un opzione compilatore e un corrispondente macro _CHAR_UNSIGNED definito se tale opzione istruisce utilizzare unsigned char predefinita.
Lo prendo che si sta parlando di campi di tipo signed char
e unsigned char
, quindi sono esplicitamente sbagliato. Se uno di loro era semplicemente char
, potrebbe corrispondere in qualsiasi compilatore il contraente sta usando (IIRC, è definito dall'implementazione se char
è signed
o unsigned
), ma non nel vostro. In tal caso, potrebbe essere in grado di cavarsela con una riga di comando di opzione o qualcosa per cambiare la tua.
In alternativa, l'imprenditore potrebbe utilizzare un compilatore, o opzioni del compilatore, che gli permettono di compilare, ignorando errori o avvisi. Sapete che tipo di ambiente di compilazione che ha?
In ogni caso, questo non è buono C. Se uno dei tipi è solo char
, si basa su un'azione attuazione definiti, e quindi non è portatile. In caso contrario, è sbagliato piatta. Io prenderei questo con il contraente.