2017-10-11 5 views
3

J'ai une question sur les macros en C++;Comportement étrange d'une macro qui utilise une autre macro

Mon code:

#define a [i] 
#define b(i) t a 

int main(){ 
int t[10]; 
int i=0; 
b(i+1)=1; 
} 

résultat voulu après préprocesseur fait son travail:

int main(){ 
int t[10]; 
int i=0; 
t[i+1]=1; 
} 

Résultat réel:

int main(){ 
int t[10]; 
int i=0; 
t[i]=1; 
} 

Je comprends ce qui se passe, mais est-il possible Je peux forcer le préprocesseur à faire ce que je veux? (donc d'abord remplacer le code dans la macro b, que d'interpréter ce code dans le cadre de la macro?)

+5

solution simple - ne pas utiliser préprocesseur – Slava

+1

Puis-je demander pourquoi vous voulez faire cela? – Borgleader

+0

Passe-je dans un() aussi? –

Répondre

4

Cet ensemble de macros produit le résultat souhaité.

#define a(i) [i] 
#define b(i) t a(i) 

Exemple test.cpp

#define a(i) [i] 
#define b(i) t a(i) 

int main(){ 
int t[10]; 
int i=0; 
b(i+1)=1; 
} 

Ensuite, en utilisant g++ -E test.cpp la sortie est:

# 1 "test.cpp" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "test.cpp" 



int main(){ 
int t[10]; 
int i=0; 
t [i+1]=1; 
}