c++ - 使用 C++ 宏从嵌套括号中提取项目

标签 c++ macros c-preprocessor

在 C++ 中,使用宏很容易将参数分开执行以下操作:

#define printThings(stringPrinting, param1, param2) printf(stringPrinting, param1, param2)

printThings(stringPrinting, param1, param2)

// Goes to

printf(stringPrinting, param1, param2)

但是我找不到办法做到这一点:

#define printThings(a, b) printf(?)

printThings(stringPrinting, Blarg(param1, param2))

// Goes to

printf(stringPrinting, param1, param2)

这可能吗?

最佳答案

你可以

#define UNPACK( a, b ) a, b
#define printThings( s, args ) printf( s, UNPACK args )

这是高级预处理器的主要宏习惯用法之一。处理可变参数的规范技术,例如在参数上分发一些宏调用,由某个我不记得的人(法语?)在 comp.lang.c 或 comp.std.c 新闻组 ca 1999 中发布,我认为它是,也许更晚。 Boost 预处理器库和 Boost 参数库有很多非常高级的东西。如果你想学习。 :)


注意 1:看起来您真的想要一个可变参数宏,用 ...(三个点)而不是命名参数定义。我相信你可以用谷歌搜索。


注意 2:由于宏是 Evil™,因此您可能真的想要一些变体

template< class... Args >
void printThings( char const* s, Args&&... args )
{
    printf( s, std::forward<Args>( args )... );
}

免责声明:未经测试的代码。

关于c++ - 使用 C++ 宏从嵌套括号中提取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080978/

相关文章:

c++ - 代码块调试预处理器

c++ - 可以将 char* move 到 std::string 中吗?

python - 如何在 Python 中为类类型应用 SWIG OUTPUT 类型映射?

c++ - ... union 问题中不允许使用构造函数

android NDK fatal error : stdio. h : No such file or directory #include <stdio. h>

c++ - #define值的大小

c++ - 串行数据包丢失 - QTSerialPort

C预处理器标记化不扩展宏?

c - 在#if 指令之前强制宏定义

c - Linux 内核链表