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.

È stato utile?

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.

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