2013-07-16 9 views
9

Ho cercato su Google e non sono riuscito a trovare linee guida, regole, stili, ecc. Quando si dichiara un intero (firmato o non firmato) in C, si può fare la scelta di usare solo ciò che il processore definisce per int oppure è possibile specificare la larghezza (ad es. uint16_t, int8_t, uint32_t, ecc.).Per dimensionare o meno?

Quando si eseguono programmi C desktop/dedicati, ho teso molto verso "usa solo i valori predefiniti" a meno che non fosse veramente importante per me specificare la larghezza (ad esempio "questo è un ID a 32 bit").

Ultimato il lavoro con più microcontrollori (pic18 e AVR), ho teso a ridimensionare tutto, solo perché si diventa così coscienti dello spazio.

E ora sto lavorando su un codice Pic32 (senza sistema operativo), dove mi trovo diviso tra i due estremi.

Sono curioso di sapere quali rubriche (se ce ne sono) le persone hanno formulato per aiutarli a decidere quando dimensionare i loro int e quando utilizzare i valori predefiniti? E perché?

+1

Durante la scrittura di software non throwaway, tendo ad usare i tipi 'uint_least32_t' ecc. A meno che non abbia bisogno di una dimensione specifica. Ciò mi consente di essere sicuro di una dimensione minima e consente al compilatore di ottimizzare per le dimensioni successive più grandi. –

+3

Questa domanda sta sollecitando un'opinione.Di solito, riservo i numeri interi per i tipi di dati che vengono comunicati attraverso una rete o che vengono memorizzati su un disco e possono essere letti successivamente da un programma diverso. – jxh

+0

@jxh Seguo la stessa pratica. Se si tratta di un tipo di dati che è solo per il consumo interno di un'istanza autonoma (vale a dire, non distribuita) del processo che definisce il tipo di dati, lascio che il compilatore scelga l'opinione della "dimensione migliore" per il tipo. Per tutto ciò che lascia il processo (sia per la memorizzazione persistente o per le comunicazioni tra processi), preferirei essere esplicito nel dimensionamento dei dati. Potrebbe essere ancora necessario conoscere i problemi di endianness, ma almeno la dimensione dei dati è prevedibile. –

risposta

6

Se qualcosa è importante per te, cerca di renderlo il più esplicito possibile.
Se non ti interessa, lascia decidere al compilatore.

Questo è abbastanza vicino a quello che hai scritto tu stesso. Se devi seguire una specifica, che dice qualcosa è a 32 bit, usa un tipo di dimensione. Se si tratta solo di un contatore di loop, utilizzare int.

2

Esiste effettivamente una linea guida che menziona questo. MISRA C ha una regola che dice che devi sempre usare i tipi di dimensioni. Ma la regola è solo consultiva, non richiesta o obbligatoria per la conformità.

Da here:

6,3 (adv): '' typedef che indicano dimensioni e signedness devono essere utilizzati al posto dei tipi di base.

2

È necessario utilizzare entrambi.

La regola di Misra è buona, ma non va bene ovunque.

Per utilizzare i tipi di dimensioni è meglio per la compilazione crossplatform, come la simulazione di un software incorporato su una piattaforma pc.

Ma anche in questo caso è necessario considerare le dimensioni di printf rispetto ai tipi di dimensioni.

uint32_t val; 

printf("%d", val); 
printf("%ld", (long)val); 

I primi printf funziona su molti piattaforma a 32 bit, ma fallisce su molte piattaforme embedded con int = 16bit/32bit lungo =.

uint16_t len = strlen("text"); 

in grado di produrre gli avvertimenti, come il tipo di ritorno di strlen è int e int può essere più grande di uint16_t, qui è meglio usare int len.

Problemi correlati