2013-04-07 2 views
0
strcpy(argv[0], arg0) 
strcpy(argv[1], arg1) 
strcpy(argv[2], arg2) 
strcpy(argv[3], arg3) 
strcpy(argv[4], arg4) 
strcpy(argv[5], arg5) 
strcpy(argv[6], arg6) 
strcpy(argv[7], arg7) 
strcpy(argv[8], arg8) 
strcpy(argv[9], arg9) 

Je sais que ce qui suit n'est pas correct, mais quelle est la bonne façon d'utiliser macro?comment simplifier le code suivant en utilisant la macro

#define ARG(i) arg##i 
for (i = 0;i < 10; i++)  
{  
strcpy(arg[i], ARG(i);  
} 
+3

Vous ne pouvez pas évaluer une variable d'exécution avant la compilation. – chris

+0

Oui, oui ... avec l'accent sur "** avant **"! – alk

+0

Pourquoi ne pas faire de 'arg' un tableau? Alors le problème devient simple. –

Répondre

0

En effet, vous ne pouvez pas utiliser ## comme ceci.

Cela pourrait fonctionner, mais encore très difficile:

#define ARG(i) ((i==0)?arg0:(i==1)?arg1:(i==2)?arg2:(i==3)?arg3:(i==4)?arg4:(i==5)?arg5:(i==6)?arg6:(i==7)?arg7:(i==8)?arg8:(i==9)?arg9:0) 
+0

semble très bien, merci! –

+0

Bien que correct, je considérerais cela peu efficace. Ou est-ce que quelqu'un pense que cela pourrait être optimisé par le compilateur? – alk

+0

la fin de la ligne ne semble pas juste, devrait ajouter "arg9: 0)" ?? –

2

Au lieu de simplifier votre séquence d'appels à strcpy vous devriez plutôt vous convertir des variables arg0, arg1, ..., arg9 à un tableau. Si vous le faites, vous serez en mesure de faire le tout dans une boucle simple.

+0

mais arg0, ... arg9 est fixé nom de variable de la fonction –

2

Je vous recommande d'utiliser des tableaux au lieu de macro dans ce cas. C'est beaucoup plus propre et n'a pas beaucoup de conditions évaluées à l'exécution;

char **args[10] = { &arg0, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9 }; 

for(i = 0; i < 10; i++) { 
    strcpy(argv[i], *args[i]); 
} 
+0

Je pense que je ne compilerai pas, car ** args [10] ne peut pas être inialized avec des variables –

+0

@ZhangBaolei Il compilera, testé avec gcc – kravemir

+0

oui, je compile –

0

utilisation BOOST

#include <stdio.h> 
#include <string.h> 
#include <boost/preprocessor.hpp> 


#define GEN_DEC(x, i, name) char* BOOST_PP_CAT(name, i); 
#define GEN_FUNC(x, i, name) strcpy(argv[i], BOOST_PP_CAT(name, i)); 

int main(int argc, char* argv[]){ 
BOOST_PP_REPEAT(10,GEN_DEC,arg) 
BOOST_PP_REPEAT(10,GEN_FUNC,arg) 

    return 0; 
} 

ligne de commande >gcc -I c:\boost_1_48_0 test.c

contrôle >gcc -I c:\boost_1_48_0 test.c -E

échantillon de sortie

int main(int argc, char* argv[]){ 
char* arg0; char* arg1; char* arg2; char* arg3; char* arg4; char* arg5; char* ar 
g6; char* arg7; char* arg8; char* arg9; 
strcpy(argv[0], arg0); strcpy(argv[1], arg1); strcpy(argv[2], arg2); strcpy(argv 
[3], arg3); strcpy(argv[4], arg4); strcpy(argv[5], arg5); strcpy(argv[6], arg6); 
strcpy(argv[7], arg7); strcpy(argv[8], arg8); strcpy(argv[9], arg9); 

    return 0; 
}