C / C ++中#define的语法不同,包括许多语句

时间:2015-02-12 09:29:46

标签: c++ c macros c-preprocessor

我理解#define的语法,

#define Pi 3.14

因此很明显,我们可以在代码中的任何位置使用Pi常量而不是3.14来使代码更具可读性。

但我遇到了如下语法。

这是否意味着每当我调用宏

doIT("hello world");

将调用{...}中的代码语句?

#define是否允许提供此类语法。 __FUNCTION____VA_ARGS__是什么意思?

#define doIT(str, ...)                                                                      \
{                                                                                               \
    if (pDoLog) pDoLog->LogMsg("[%s] Error: " str, LOG_WRONG, __FUNCTION__, ##__VA_ARGS__); \
    printf("[%s] Error: " str "\n", __FUNCTION__, ##__VA_ARGS__);                               \
}

1 个答案:

答案 0 :(得分:4)

你没有“调用”一个宏,它的扩展不会被“调用”。在编译代码之前,预处理器只是将宏替换为它的扩展。

doIt(str)括号定义的宏是一个“类函数宏”,这意味着它需要可以在宏的扩展中使用的参数。

参数列表中带有...的类函数宏表明它可以接受可变数量的参数。特殊预定义符号__VA_ARGS__扩展为传递给...占位符的参数列表。

__FUNCTION__是一个特殊的预定义符号,它扩展为正在编译的当前函数的名称,因此无论宏扩展到何处,它都将使用封闭函数的名称。