在代码中修改宏的名称

时间:2014-03-03 20:31:22

标签: c

我觉得这很简单,我只是缺少一些东西,但我希望有一个函数来检查作为预定义宏的一部分的一堆值的值。 该功能类似于:

for (i=0  i <100...
if namei_int ==0
{
code
}

如何修改该宏调用名称?它是name0_int name1_int ...

如果有办法的话。到目前为止,我已经制作了一堆if和case语句,但是,我假设有一种更简单的方法。

我已经研究过制作一个#define数组[100] = [name0_int,name2_int ....]

1 个答案:

答案 0 :(得分:2)

宏在运行时不会扩展,它们会在代码到达编译器之前对代码进行文本更改。您可以使用连接运算符来获取执行所需操作的宏:

#define GET_NAME_INT(x) name ## x ## _int
GET_NAME_INT(0) /* this is name0_int */
GET_NAME_INT(1) /* this is name1_int */

但是你无法循环来获得你想要的东西 - 使用变量i在编译时扩展为namei_int。您也不能将宏放在数组中,它们不是运行时存在的那种东西。

但是,您可以将函数指针放入数组中,我认为在这种情况下通常是您想要的。即:

struct my_args {int x, y, z};
void function1(struct my_args *);
void function2(struct my_args *);
void function3(struct my_args *);
void function4(struct my_args *);

...
int i;
void (*my_funcs)(struct my_args *)[] = {function1, function2, function3, function4};
struct my_args args= {0, 1, 50};

for(i = 0; i < 4; i++) {
    my_funcs[i](&args);
}

如果你真的想使用宏,你可以通过将其拉出到函数调用中来消除重写“代码”部分,(或者,如果你愿意,还可以使用宏。)即:

    /* just an example, the do while is so you can put a ';' after and 
     * make it look like a statement */

    #define DO_STUFF do{j += ((x + y - 4) / 17 + i)}while(0)

    i = 0;
    if (name0_int == 0)
         DO_STUFF;
    i++;
    if (name1_int == 0)
         DO_STUFF;
    i++;
    if (name2_int == 0)
         DO_STUFF;

像这样调试宏代码可能是一项真正的苦差事,如果使用宏的目的是性能,则可以考虑内联函数,如果必须通过调试器进行爬网,则可以关闭验证。