如何使用宏简化以下代码

时间:2013-04-07 08:21:19

标签: c

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 个答案:

答案 0 :(得分:2)

您应该将变量strcpyarg0,...,arg1转换为数组,而不是简化对arg9的调用顺序。如果你这样做,你将能够在一个简单的循环中完成整个事情。

答案 1 :(得分: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] );
}

答案 2 :(得分: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)

答案 3 :(得分: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;
}