Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以像这样用变量args编写C预处理器宏?_C_C Preprocessor - Fatal编程技术网

有没有一种方法可以像这样用变量args编写C预处理器宏?

有没有一种方法可以像这样用变量args编写C预处理器宏?,c,c-preprocessor,C,C Preprocessor,我想要一个C预处理器宏,它可以转换: if (IN(node->type, BRANCH, CAPTURE_START, CAPTURE_END)) { ... } 为此: if (node->type == BRANCH || node->type == CAPTURE_START || node->type == CAPTURE_END) { ... } 这有点类似于MySQL IN操作符。可能吗?CPP不支持在参数列表上迭代。“C”中最接近的结构

我想要一个C预处理器宏,它可以转换:

if (IN(node->type, BRANCH, CAPTURE_START, CAPTURE_END)) {
    ...
}
为此:

if (node->type == BRANCH || node->type == CAPTURE_START || node->type == CAPTURE_END) {
    ...
}

这有点类似于MySQL IN操作符。可能吗?

CPP不支持在参数列表上迭代。“C”中最接近的结构将是switch语句,但它本身不会导致

  switch (node->type ) {
      case V1:
      case V2:
      case V3:
          ...
   }
作为替代方案,您可以使用 具有vararg函数的函数。这是一个限制,(1)类型必须已知,(2)将有一个特殊值(示例中的最后一个)来指示列表的结尾

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdarg.h>

#define LAST (-1)

bool in_int_set(int v, ...)
{
   va_list ap ;
   va_start(ap, v) ;
   for (;;) {                        // forever
        int s = va_arg(ap, int) ;
        if ( s == LAST ) return false ;
        if ( s == v ) return true ;
   } ;
}

void main(void) {
        printf("A=%d\n", in_int_set(5,      3, 5, 7, LAST)) ;
        printf("B=%d\n", in_int_set(5,      2, 4, 6, 8, 10, LAST)) ;
// From the question about
        if ( in_int_set(node->type,     BRANCH, CAPTURE_START, CAPTURE_END, LAST) ) {
            ...
        }
}
#包括
#包括
#包括
#包括
#定义最后一个(-1)
bool in_int_set(int v,…)
{
va_列表ap;
va_启动(ap,v);
为了(;){//永远
int s=va_arg(ap,int);
如果(s==LAST),则返回false;
如果(s==v)返回true;
} ;
}
真空总管(真空){
printf(“A=%d\n”,在(5,3,5,7,最后一个)集合中);
printf(“B=%d\n”,在(5,2,4,6,8,10,最后一个)的int_集合中;
//从关于
if(在集合中(节点->类型、分支、捕获开始、捕获结束、最后)){
...
}
}

您是否只是在寻找简单的宏替换,以检查给定值是否为这些选项中的任何一个?如果是这样的话,你可以只做
#在(val,opt1,opt2,opt3)中定义(val==opt1 | | val==opt2 | | val==opt3)
我想要那个,但要有任意数量的选项,而不是任意数量的。即使计算宏参数,您也需要为每个参数计数编写一到两个宏。。。