Domanda

Sono un po 'confuso tra ciò che è e non è un'espressione costante in C, anche dopo molto googleing. Potrebbe fornire un esempio di qualcosa che è, e che non è, un'espressione costante in C?

È stato utile?

Soluzione

Un'espressione costante può essere valutata in fase di compilazione. Ciò significa che non ci sono le variabili in esso. Ad esempio:

5 + 7 / 3

è un'espressione costante. Qualcosa di simile:

5 + someNumber / 3

non è, assumendo someNumber è una variabile (cioè, non di per sé una costante fase di compilazione).

Altri suggerimenti

C'è un altro sottigliezza di espressioni costanti. Ci sono alcune cose che sono noti per il compilatore, ma non possono essere noti al preprocessore.

Per esempio (24*60*60) può essere calcolata da entrambi, ma sizeof struct foo è noto solo al compilatore. Questa distinzione può importa se si sta cercando di verificare che un struct è definito per soddisfare una dimensione mandato all'esterno, o che i suoi membri sono mappati in offset specificati esternamente. (Questo caso di utilizzo si pone spesso quando codifica driver di dispositivo in cui il struct descrive dispositivo registra come spiegate nello spazio di memoria.)

In quel caso non si può semplicemente dire #if (sizeof(struct UART) == 12) perché il preprocessore funziona a un passaggio in vista della compilazione e semplicemente non può conoscere le dimensioni di tutti i tipi. È, tuttavia, un'espressione costante e sarebbe valida come inizializzazione di una variabile globale (ad esempio int UARTwords = sizeof(struct UART) / sizeof(short);), o di dichiarare la dimensione di un array (ad esempio unsigned char UARTmirror[sizeof(struct UART)];)

Nessuno sembra aver menzionato un altro tipo di espressione costante: l'indirizzo costanti. L'indirizzo di un oggetto con la durata di archiviazione statica è una costante indirizzo, quindi si può fare questo genere di cose nell'ambito di file:

char x;
char *p = &x;

Le stringhe letterali definiscono le matrici con la durata di archiviazione statica, quindi questa regola è anche il motivo per cui si può fare questo nell'ambito di file:

char *s = "foobar";

Ogni letterale valore singolo è un'espressione costante.

3     0.0f    '\n'

(stringhe letterali sono strani, perché sono in realtà gli array. Sembra "hello" in realtà non è una costante, in quanto finisce per dover essere collegato e tutto ciò che, e l'indirizzo e il contenuto può cambiare in fase di esecuzione).

La maggior parte degli operatori (sizeof, calchi, ecc) applicato a costanti o tipi sono espressioni costanti.

sizeof(char)
(byte) 15

Qualsiasi espressione che coinvolge solo espressioni costanti stesso è anche un'espressione costante.

15 + 3
0.0f + 0.0f
sizeof(char)

Qualsiasi espressione che coinvolge chiamate di funzione o espressioni non costanti è di solito non un'espressione costante.

strlen("hello")
fifteen + x

Qualsiasi Tipo di macro come un'espressione costante dipende da ciò che si espande a.

/* Always a constant */
#define FIFTEEN 15

/* Only constant if (x) is
#define htons(x)  (( ((x) >> 8) | ((x) << 8) ) & 0xffff) 

/* Never constant */
#define X_LENGTH  strlen(x)

Inizialmente avevo alcune cose in qui circa identificatori const, ma ho provato che e apparentemente non si applica in C. const, stranamente, non dichiara le costanti (almeno, non quelli "costante" abbastanza per essere utilizzato nelle dichiarazioni switch). In C ++, tuttavia, lo fa.

Un altro divertente po 'di rughe: in C, il valore di un 'enum' è una costante, ma può essere utilizzato solo dopo la dichiarazione del 'enum' è completa. Di seguito, per esempio, non è accettabile in serie C, anche se è accettabile in C ++:

enum {foo=19, bar, boz=bar+5;};

Potrebbe essere riscritta:

enum {foo=19, bar}; enum {boz=bar+5;};

se questo finirebbe definire più tipi di enumerazione diversi, piuttosto che uno che contiene tutti i valori.

integral character constants anche come 'a' o '\n' sono costanti che il compilatore riconosce come tale. Hanno tipo int.

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