19得票3回答
在 __VA_ARGS__ 的末尾添加内容

我知道我可以这样做:#define MACRO(api, ...) \ bool ret = api(123, ##__VA_ARGS__); 这只是一个例子,它是更复杂解决方案的一部分。重点是我需要将可变数量的参数附加到第一个123。##号使编译器在没有传入MACRO参数的情况下剥离掉1...

16得票9回答
在Visual C++中是否有一种方法可以编写具有可变参数列表的宏?

据我所知,在 gcc 中你可以这样写: As far as I know, in gcc you can write something like:#define DBGPRINT(fmt...) printf(fmt); 在VC++中有没有一种方法可以做到这一点?

15得票2回答
这是一种有效的检查可变宏参数列表是否为空的方法吗?

我一直在寻找一种方法来检查可变宏参数列表是否为空。我发现的所有解决方案似乎要么相当复杂,要么使用非标准扩展。 我认为我找到了一个既紧凑又标准的简单解决方案:#define is_empty(...) ( sizeof( (char[]){#__VA_ARGS__} ) == 1 ) 问:有没有...

14得票1回答
C语言中带有三个点的#define是什么?

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(ANDROI...

14得票1回答
无参数的可变宏及其可变参数

如果一个可变参数宏M的参数列表不以省略号结尾,那么在调用这个类函数宏时,传递给它的实参(包括那些由零个预处理记号组成的实参)的个数必须等于该宏在定义时所指定的形参的个数。否则,在调用该类函数宏时,必须传递更多的实参比该宏在定义时所指定的形参的个数多1(不包括...)。调用必须以右括号)结束。 ...

13得票1回答
整理C/C++代码时发现可变宏存在问题

我们正在对 C、C++ 和 Java 的代码库进行一些清理工作,修复已签名/未签名的比较、运行静态分析等。 我们收到的警告之一是:warning: ISO C does not permit named variadic macros 还有它的伴随警告warning: ISO C99 req...

12得票3回答
使用__VA_ARGS__定义字符串化宏时出现错误

我一直在尝试在C语言中实现一个函数宏,它将"DEBUG: "添加到参数前,并将其参数传递给printf:#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__) 使用gcc时出现了以下错误:src/include/...

12得票2回答
C预处理器将"int x"拆分为int和x。

我需要能够获取以下内容:#define MY_MACRO(PARAM1,PARAM2) \ MY_OTHER_MACRO(TYPENAME_OF(PARAM1),PARAMNAME_OF(PARAM1));\ MY_OTHER_MACRO(TYPENAME_OF(PARAM2),PARAM...

12得票2回答
使用C11和-Wno-variadic-macros时,ISO C99要求可变宏中的“…”至少有一个参数。

我有一个简单的宏定义:#define log(text, ...) fprintf(stderr, "stuff before" text "stuff after", ## __VA_ARGS__);,会触发错误:error: ISO C99 requires at least one ar...

11得票3回答
带零参数和逗号的可变宏

考虑这个宏: #define MAKE_TEMPLATE(...) template <typename T, __VA_ARGS__ > 当使用零个参数时,它会产生糟糕的代码,因为编译器期望在逗号后面有一个标识符。实际上,VC的预处理器足够聪明,可以删除逗号,但GCC的预处...