c++ - C++ 宏的可选参数

标签 c++ macros

是否有某种方法可以使用 C++ 宏获取可选参数?某种类型的重载也很好。

最佳答案

这是一种方法。它使用参数列表两次,首先形成辅助宏的名称,然后将参数传递给该辅助宏。它使用标准技巧来计算宏的参数数量。

enum
{
    plain = 0,
    bold = 1,
    italic = 2
};

void PrintString(const char* message, int size, int style)
{
}

#define PRINT_STRING_1_ARGS(message)              PrintString(message, 0, 0)
#define PRINT_STRING_2_ARGS(message, size)        PrintString(message, size, 0)
#define PRINT_STRING_3_ARGS(message, size, style) PrintString(message, size, style)

#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
#define PRINT_STRING_MACRO_CHOOSER(...) \
    GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
                PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )

#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)

int main(int argc, char * const argv[])
{
    PRINT_STRING("Hello, World!");
    PRINT_STRING("Hello, World!", 18);
    PRINT_STRING("Hello, World!", 18, bold);

    return 0;
}

这使得宏的调用者更容易,但对于编写者来说则不然。

关于c++ - C++ 宏的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15405370/

相关文章:

c++ - 如何重载逗号运算符以将值分配给数组

c++ - 如何在我的程序中找到 "const char* + int"表达式

c++ - 使用 MinGW 在 Eclipse 中 boost 单元测试不产生输出

c++ - 使用 reinterpret_cast 和 static_cast 模拟具有多态参数的模板中的协变和逆变?

c - 宏中的数学是在编译时计算的吗?

http - std::io::TcpStream::read_as_string 返回空字符串

c - 如何获取OPENSSL中MACRO生成的函数的地址

c++ - 创建一个用 0,1,2,3 元组初始化的多维数组,

c - 有什么方法可以通过宏生成参数依赖于编译时信息的函数吗?

用于日期的 Xcode 预处理器宏