ho questo codice che funziona:C preprocessore utilizzando la staffa di un genitore macro chiusura
#include <stdio.h>
#define A(x) x B
#define B(x) C(x,
#define C(x,y) y x)
int main(void) {
printf(A("1") ("2") "3");
}
esso stampa 132
(il punto del A
macro è quello di scambiare la cosa che segue i parametri tra parentesi con tutto dopo che fino a un'altra parentesi di chiusura)
Ma se io uso che all'interno di un'altra macro:
#define Z(x) x
printf(Z(A("1") ("2") "3"));
ottengo l'errore di compilazione "Chiamata macro simile a una funzione non terminata".
Mi rendo conto che ciò accade perché il compilatore sta tentando di elaborare gli argomenti di Z
in modo indipendente, ma ho bisogno di usare il suo parentesi di chiusura come marcatore. C'è un modo per farlo funzionare all'interno dei macro? La modifica della sintassi chiamante non è realmente un'opzione.
p.s. Prima di ottenere qualsiasi risposta parlando di ciò che è terribile da fare, state tranquilli: questo non è per codice reale. Si tratta di un problema che si è verificato durante la creazione di un programma giocattolo che utilizza define
per simulare una nuova lingua all'interno di C.
Grazie per la spiegazione approfondita. Sfortunatamente la soluzione non è applicabile al mio problema esatto (ho ancora bisogno di altre macro all'interno di Z per espandere). Per quanto riguarda M4, beh, se fosse un progetto vero, sarei d'accordo, ma la sfida è farlo con il bizzarro preprocessore di C! Come domanda correlata, sarebbe possibile usare le parentesi di '()' invece di '[]'? cioè c'è un modo per sfuggire ai personaggi delle parentesi? – Dave
Non capisco la tua domanda correlata. Stavo solo usando parentesi quadre per l'illustrazione; per quanto riguarda il preprocessore, non hanno alcun significato speciale. – zwol
Intendo questa riga: '#define C (x, y) y x]/* nota parentesi quadra chiusa invece di parentesi chiusa * /' come a ')', si interrompe. – Dave