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?
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?
#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
Vorrei poter +1 ancora una volta per la citazione standard, molto utile. – GManNickG
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
.
+1 Trova-sostituisci globale è la spiegazione più chiara, più adatta ai novizi –
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.
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
@GMan: Perché è ancora un int anche se potrebbe essere un semplice char di 1 byte? Modifica (Sì, so che char non è necessariamente 1 byte) –
@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". –
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.
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? –
@Changeling: basato sulle regole standard C++. –
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
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
@GMan : Buon collegamento .. Nel mio compilatore e ambiente, è 2 byte quindi dovrei aver chiarito .. grazie –
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)'. –