Tag: variadic macros

变体宏:粘贴标记的扩展

我想知道是否可以“嵌套”可变宏调用。 我只关心GCC和Clang。 我的宏定义如下所示: /** * @brief Invoke an instance method. */ #define $(obj, method, …) \ ({ \ typeof(obj) _obj = obj; \ _obj->interface->method(_obj, ## __VA_ARGS__); \ }) 我用它在我的OO框架中方便地调用“实例方法”( https://github.com/jdolan/objectively ): $(array, addObject, obj); 工作老板。 不幸的是,我还没有想出一种允许嵌套这些调用的方法,这在某些情况下非常有用; 例如: /** * @see MutableSetInterface::addObjectsFromArray(MutableSet *, const Array *) */ static void addObjectsFromArray(MutableSet *self, const Array *array) { if […]

宏中的__VA_ARGS__是什么意思?

/* Debugging */ #ifdef DEBUG_THRU_UART0 # define DEBUG(…) printString (__VA_ARGS__) #else void dummyFunc(void); # define DEBUG(…) dummyFunc() #endif 我在C编程的不同标题中看到了这种符号,我基本上理解它是通过参数,但我不明白这个“三点符号”是什么叫? 有人可以通过示例解释它或提供有关VA Args的链接吗?

我可以在中间而不是结尾使用__VA_ARGS定义可变参数C预处理器宏吗?

如果我这样做,海湾合作委员会会抱怨: #define M(obj,met, …, contents) obj##_##met(const void * self, __VA_ARGS__) { \ contents \ } 给我这两个理由: error: missing ‘)’ in macro parameter list warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro 显然,C99样式的可变参数宏在省略号之后立即期望右括号,有效地要求可变参数列表是宏的最后一个参数。 我需要它在中间来产生我在上面的宏中描述的速记符号。 GCC是否支持此function,使用另一种(非C99)可变参数宏样式? 我可以模仿它在其他地方做吗? 我最后不想要可变列表,它会让我的符号混乱。 我只能使用GCC。

检测C宏中是否存在参数

如何定义C宏IFARGS(YES, NO, …) ,以便调用没有附加参数的IFARGS会产生NO ,并且调用带有一个或多个参数的IFARGS会产生YES ? 我有一个使用GCC的答案(见下文),但如果可能的话,我更喜欢C99(或其不可能性的certificate)。

令牌贴在C中

看完VA_NARG后 我尝试使用宏根据C中的参数数量实现函数重载。 现在的问题是: void hello1(char *s) { … } void hello2(char *s, char *t) { … } // PP_NARG(…) macro returns number of arguments :ref to link above // does not work #define hello(…) hello ## PP_NARG(__VA_ARGS__) int main(void) { hello(“hi”); // call hello1(“hi”); hello(“foo”,”bar”); // call hello2(“foo”,”bar”); return 0; } 我从C-faq那里读到了这个 。 但仍然无法让它工作……

附加到__VA_ARGS__

我知道我可以这样做: #define MACRO(api, …) \ bool ret = api(123, ##__VA_ARGS__); 这只是一个例子,它是更复杂的解决方案的一部分。 关键是我需要将可变数量的参数附加到第一个123. ##使编译器在123参数之后删除逗号,如果没有参数传递给MACRO。 但现在我想向api附加参数,如下: #define MACRO(api, …) \ bool ret = api(__VA_ARGS__##, 456); 诺坎多。 一种解决方案是使用两个宏,MACRO和MACRO_V,并使_V版本不处理任何参数。 但有没有办法让它与一个宏一起工作?

Variadic宏和尾随逗号

我试图在C中进行面向对象,并希望为符号设置一个语法糖宏 object->vtable->method(object, arg1, arg2) 成 send(object, method, arg1, arg2) 不幸的是,当一个方法不参数时,就会出现尾随的逗号问题 send(object, method) 给 object->vtable->method(object, ) 是否有任何便携式 (没有##__VA_ARGS__或Visual Studio)这样做? 我想出了一个,但我需要交换对象和方法 #define FIRST_ARG_(N, …) N #define FIRST_ARG(args) FIRST_ARG_(args) #define send(msg, …) \ FIRST_ARG(__VA_ARGS__)->vtable->msg(__VA_ARGS__) 许可证 send(method, object) send(method, object, arg1, arg2) 编辑 在下面两个很好的答案的帮助下,我将使用这些宏来完成。 它最多可以处理16个参数,但可以轻松扩展 #define SEND_NO_ARG(obj, msg) obj->vtable->msg(obj) #define SEND_ARG(obj, msg, …) obj->vtable->msg(obj, __VA_ARGS__) #define GET_18TH_ARG(arg1, arg2, arg3, […]

C中的#define有三个点

#define LOGI(…) ((void)__android_log_print(ANDROID_LOG_INFO, “native-activity”, __VA_ARGS__)) #define LOGW(…) ((void)__android_log_print(ANDROID_LOG_WARN, “native-activity”, __VA_ARGS__)) 这是这两个宏的定义; 稍后在代码LOGI和LOGW中使用这种方式 LOGI(“accelerometer: x=%fy=%fz=%f”, event.acceleration.x, event.acceleration.y, event.acceleration.z); 就这样 LOGW(“Unable to eglMakeCurrent”); 由于我总是试图避免复杂的宏和#define ,我无法得到这个宏的实际含义。 这里的3点符号有什么作用? 这个#define后来在代码中有什么变化? 显然我知道3个点用于表示和无限量的参数,但我不知道如何阅读这种情况。

使用__VA_ARGS__转换在MACRO中传递的所有参数

我有一个宏FOO(…)接收未知数量的参数。 我想把所有这些参数都用于uint。 有没有办法实现它?

变量宏,零参数

我正在研究一个调用宏, #define CALL(f,…) FN(f)->call((ref(new LinkedList()), __VA_ARGS__)) 什么时候叫, CALL(print,2,3,4,5); 将2 3 4 5添加到链接列表(,重载以执行此操作)并调用print,其中需要一个按预期工作的链表,但是有些调用不需要参数, CALL(HeapSize); 它仍然需要一个链接列表,但是空的一个,上面不起作用,我试图想出一个可以使用任何一种风格的宏吗? 编辑:挖掘gcc文档我发现在VA_ARGS之前添加##会删除,当没有参数但是我无法嵌套宏时, CALL(print,CALL(HeadSize)); 这会导致CALL未定义错误,如果我分离它的工作调用