替换宏变量中的字符串?

时间:2010-10-27 22:13:23

标签: c macros c-preprocessor string-concatenation stringification

我有一个宏,我传入一个参数并使用它根据输入的名称定义一个新变量:

#define DO_X(x) char _do_x_var_ ## x; /* other things */

问题是如果我传入一个struct变量,它会中断:

DO_X(some_struct->thing)

变为:

char _do_x_var_some_struct->thing; /* other things */

编辑:我想要评估的是:

char _do_x_var_some_struct__thing; /* other things */

(或包含与输入类似的任何有效变量名称)

我真正想要的是这些工作:

#define DO_X(x) for(char _do_x_var_ ## x; /*things*/)
DO_X(x){
    DO_X(y) {
        /*things*/
    }
}

DO_X(object->x){
    DO_X(object->y) {
        /*things*/
    }
}

但是这些失败了:

#define DO_X(x) for(char _do_x_var_ ## x; /*things*/)
DO_X(x){
    DO_X(x) { // <-- multiple definition of _do_x_var_x
        /*things*/
    }
}

DO_X(object->x){
    DO_X(object->x) { // <-- multiple definition of _do_x_var_object__x (or whatever)
        /*things*/
    }
}

有没有办法让这项工作?也许用->或其他东西替换__?我已经找到了连接方法,但没有替换字符串..

2 个答案:

答案 0 :(得分:4)

你还没有找到重写任意字符串的方法,因为宏不能这样做。宏名称必须是有效标识符,->不是。 C预处理器的功能非常有限。您可以查看m4以获得更强大的预处理器,但您可能会走错路。

答案 1 :(得分:2)

我不知道任何预处理器机制将struct-&gt;元素参数视为两个单独的标记或自动转换 - &gt;到下划线。我的建议是有一个单独的宏,例如DO_X2(struct_ptr,element),它会添加“ - &gt;”或“_”在需要的地方。然后您可以根据需要使用DO_X或DO_X2。

如果您计划按指示使用这些宏,则会出现单独的问题。内部for循环可以声明完全相同的变量名称,因为它们具有不同的范围,所以它不会被视为错误。例如,假设您的C编译器支持在for语句中声明迭代器,就像这样(我不认为是C的标准行为):

for (int i=0; i<10; ++i)

然后您可以执行以下操作,这不会被视为错误:

int sum = 0;
for (int i=0; i<10; ++i)
    for (int i=0; i<10; ++i)
        ++sum;

两个“int i”具有不同的范围,因此它应该编译并执行得很好。