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)

我知道以下是不正确的,但是使用宏的正确方法是什么?

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

4 回答 4

2

与其简化对您的调用序列,strcpy不如将您的变量arg0, arg1, ...转换arg9为数组。如果你这样做,你将能够在一个简单的循环中完成整个事情。

于 2013-04-07T08:24:20.513 回答
2

在这种情况下,我建议您使用数组而不是宏。它更干净,并且在运行时没有评估很多条件;

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

for( i = 0; i < 10; i++ ) {
    strcpy( argv[i], *args[i] );
}
于 2013-04-07T08:46:07.237 回答
0

确实不能这样使用##

这可以工作,虽然非常尴尬:

#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)
于 2013-04-07T08:31:08.700 回答
0

使用 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;
}

命令行 >gcc -I c:\boost_1_48_0 test.c

查看 >gcc -I c:\boost_1_48_0 test.c -E

输出样本

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;
}
于 2013-04-07T08:49:58.877 回答