我觉得这很简单,我只是缺少一些东西,但我希望有一个函数来检查作为预定义宏的一部分的一堆值的值。 该功能类似于:
for (i=0 i <100...
if namei_int ==0
{
code
}
如何修改该宏调用名称?它是name0_int name1_int ...
如果有办法的话。到目前为止,我已经制作了一堆if和case语句,但是,我假设有一种更简单的方法。
我已经研究过制作一个#define数组[100] = [name0_int,name2_int ....]
答案 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;
像这样调试宏代码可能是一项真正的苦差事,如果使用宏的目的是性能,则可以考虑内联函数,如果必须通过调试器进行爬网,则可以关闭验证。