C/C++ 中#define 的不同语法,包括许多语句
Different syntax for #define in C/C++ including many statements
我理解 #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__); \
}
您没有 "call" 宏,它的扩展不会 "invoked"。在代码被编译之前,预处理器只是用它的扩展替换宏。
用圆括号定义的宏,例如 doIt(str)
是一个 "function-like macro",这意味着它接受可用于宏扩展的参数。
参数列表中带有 ...
的类似函数的宏表示它可以接受可变数量的参数。特殊的预定义符号 __VA_ARGS__
扩展为传递给 ...
占位符的参数列表。
__FUNCTION__
是一个特殊的预定义符号,它扩展为当前正在编译的函数的名称,因此无论宏在哪里扩展,它都将使用封闭函数的名称。
我理解 #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__); \
}
您没有 "call" 宏,它的扩展不会 "invoked"。在代码被编译之前,预处理器只是用它的扩展替换宏。
用圆括号定义的宏,例如 doIt(str)
是一个 "function-like macro",这意味着它接受可用于宏扩展的参数。
参数列表中带有 ...
的类似函数的宏表示它可以接受可变数量的参数。特殊的预定义符号 __VA_ARGS__
扩展为传递给 ...
占位符的参数列表。
__FUNCTION__
是一个特殊的预定义符号,它扩展为当前正在编译的函数的名称,因此无论宏在哪里扩展,它都将使用封闭函数的名称。