2012-11-18 16 views
6

Quanti passaggi esegue il preprocessore C rispetto al codice?Quanti passaggi ha fatto il preprocessore C?

ho testato seguente codice su gcc 4.7.2

#define a 5 
#define b a 
#define c b 
#define d c 
#define e d 
#define f e 
#define g f 
#define h g 
#define j h 
#define k j 
#define l k 
#define m l 

int main(void) {return d;} 

Non v'è alcun errore:

$ gcc -E 1.c 
# 1 "1.c" 
# 1 "<command-line>" 
# 1 "1.c" 
# 14 "1.c" 
int main(void) {return 5;} 

E 'un comportamento normale?

+5

Perché * dovrebbe * esserci un errore? –

risposta

13

Il preprocessore C continua fino a quando non c'è più nulla da espandere. Non è una questione di passaggi; è una questione di completezza.

Evita l'espansione ricorsiva di macro. Una volta che una macro è stata espansa una volta, non viene ri-espansa nel testo sostitutivo.


L'unica cosa che lo standard dice di limiti sulle macro di espansione è in §5.2.4.1 limiti di traduzione, dove si dice:

The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:18)

...

  • 4095 macro identifiers simultaneously defined in one preprocessing translation unit

18) Implementations should avoid imposing fixed translation limits whenever possible.

Così, il preprocessore deve essere in grado di gestire almeno 4095 macro, e se tutte tranne una di quelle macro si espandono in un'altra macro in sequenza, come nell'esempio, il risultato deve essere corretto.

Problemi correlati