2010-07-07 14 views
10

Se un valore viene definito comeSuperficie #define valori

#define M_40 40

è la dimensione stessa come short (2 byte) o è come char (1 byte) o int (4 byte)?

La dimensione dipende dal fatto che si sia 32 bit o 64 bit?

+0

Chi dice che 'short' sarà di 2 byte o che' int' sarà di 4 byte? Queste sono le uniche garanzie che hai: http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and-a-long-in-c/271132#271132 – GManNickG

+0

@GMan : Buon collegamento .. Nel mio compilatore e ambiente, è 2 byte quindi dovrei aver chiarito .. grazie –

+4

Questa domanda è codificata con C++, quindi presumo che è quello che la tua programmazione in. Non c'è un buon motivo per usare '# define' per questo genere di cose in C++. Basta scrivere 'const int M_40 = 40;' e sii fatto con esso. Puoi quindi cambiare 'int' in' short' o 'char' o qualsiasi cosa ti piaccia se ti interessa la dimensione. Inoltre, è come se mancasse il punto delle costanti nominate se il nome della costante è solo il suo valore. Scrivere 'foo (M_40)' non ha esattamente un significato più chiaro di 'foo (40)'. –

risposta

28

#define non ha dimensioni in quanto non è un tipo ma una sostituzione di testo normale nel codice C++. #define è una direttiva di pre-elaborazione e viene eseguita prima che il codice inizi a essere compilato.

La dimensione in codice C++ dopo la sostituzione è qualunque sia la dimensione di quale espressione o codice C++ è presente. Ad esempio, se hai il suffisso con L come 102L, allora è visto un lungo, altrimenti senza suffisso, solo un int. Quindi 4 byte su x86 e x64 probabilmente, ma questo dipende dal compilatore.

Forse sezione letterale Integer del C++ standard sarà cancellarlo per voi (Sezione 2.13.1-2 dello standard C++ 03):

Il tipo di un intero letterale dipende sulla sua forma , valore e suffisso. Se è decimale e non ha suffisso, ha il primo di questi tipi in cui può essere rappresentato il suo valore : int, long int; se il valore non può essere rappresentato come int lungo, il comportamento di non è definito. Se è ottale o esadecimale e non ha suffisso, è il primo di questi tipi in cui è possibile rappresentare il valore : int, int unsigned, long int, unsigned long int. Se è suffisso da u o U, il suo tipo è il primo di questi tipi in il cui valore può essere rappresentato: int unsigned, unsigned long int. Se è suffisso da l o L, il suo tipo è il primo di questi tipi in cui è possibile rappresentare il suo valore : long int, unsigned long int. Se il suffisso da ul, lu, uL, Lu, Ul, Lu, UL, o LU, suo tipo è unsigned long int

+1

Vorrei poter +1 ancora una volta per la citazione standard, molto utile. – GManNickG

7

Un intero semplice sta per essere implicitamente in int in tutti i calcoli e incarichi.

#define indica semplicemente al preprocessore di sostituire tutti i riferimenti a un simbolo con qualcos'altro. Questo è come fare una ricerca globale sostituisci sul tuo codice e sostituendo M_40 con 40.

+0

+1 Trova-sostituisci globale è la spiegazione più chiara, più adatta ai novizi –

2

Un valore #define non ha dimensioni, in particolare. È solo una sostituzione di testo. Dipende dal contesto in cui (e cosa) viene sostituito.

Nell'esempio in cui si utilizza M_40, la compilazione vedrà 40 e di solito lo tratta come in int.

Tuttavia, se avessimo:

void SomeFunc(long); 

SomeFunc(M_40); 

Sarà trattato come un lungo.

+1

Non di solito, sempre. E la costante '40' sarà ancora un' int' nel tuo codice di esempio. Tuttavia, il valore '40' sarà promosso a' long' dopo aver chiamato la funzione. Ma '40' la costante è ancora un' int'. – GManNickG

+0

@GMan: Perché è ancora un int anche se potrebbe essere un semplice char di 1 byte? Modifica (Sì, so che char non è necessariamente 1 byte) –

+0

@GMan: #define L (X) X ## L L (M_40) ora è lungo. #define S (X) #X S (M_40) ora è un char *, motivo per cui ho detto "di solito". –

1

Il preprocessore esegue semplicemente la sostituzione di testo semplice, quindi il fatto che la costante sia in un #define non importa. Tutto lo standard C dice che "Ogni costante deve avere un tipo e il valore di una costante deve essere compreso nell'intervallo di valori rappresentabili per il suo tipo." È probabile che il C++ non vari molto da quello.

+0

Andando oltre, cosa rende C++ cast il valore in un 'int' invece di char quando 40 è un valore accettabile per esempio, char senza segno dato che è compreso tra 0 e 255? –

+3

@Changeling: basato sulle regole standard C++. –

2

I macro di preprocessore vengono letteralmente scambiati durante la fase di pre-elaborazione della compilazione.

Per esempio il codice

#define N 5 

int value = N; 

otterrà scambiato per

int value = 5; 

quando il compilatore vede. Non ha una dimensione propria come tale