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

标签 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__);                               \
}

最佳答案

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

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

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

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

关于c++ - C/C++ 中#define 的不同语法,包括许多语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28473791/

相关文章:

c - C 中的隐式函数声明

python - UNIX套接字编程: Issues Getting a C Client to Connect to a Python Server

vba - 计算函数在 vba 中是否正常工作

c - 最小-最大选择——那是什么算法?

macros - 在 Racket 中,我可以重新定义形式 `if` 并让其他派生形式自动遵循其新语义吗?

c++ - 是否可以在 cmake 中更改库链接顺序

c++ - cppUnit 在启动每个单元测试时是否使用 fork()?

c++ - 使对象可用于所有方法 C++

c - ARM:没有帧指针的调用堆栈生成

c++ - 您需要先加载内核错误