我有一个宏,我传入一个参数并使用它根据输入的名称定义一个新变量:
#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*/
}
}
有没有办法让这项工作?也许用->
或其他东西替换__
?我已经找到了连接方法,但没有替换字符串..
答案 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”具有不同的范围,因此它应该编译并执行得很好。