有没有一种方法可以像这样用变量args编写C预处理器宏?
我想要一个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”中最接近的结构
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)
我想要那个,但要有任意数量的选项,而不是任意数量的。即使计算宏参数,您也需要为每个参数计数编写一到两个宏。。。