c++:复杂的类函数宏定义
C++: complex function-like macro definition
在阅读node.js源代码时,我遇到了一个我无法理解的宏。
// Strings are per-isolate primitives but Environment proxies them
// for the sake of convenience.
#define PER_ISOLATE_STRING_PROPERTIES(V)
V(address_string, "address")
V(args_string, "args")
V(argv_string, "argv")
V(async, "async")
V(async_queue_string, "_asyncQueue")
V(atime_string, "atime")
...
*我假设变量(例如address_string)是在包含的头文件中定义的。
就这样持续了一段时间。我进一步查看了代码,以了解如何使用它。
#define V(PropertyName, StringValue)
inline v8::Local<v8::String> PropertyName() const;
PER_ISOLATE_STRING_PROPERTIES(V)
#undef V
据我所知,PER_ISOLATE_STRING_PROPERTIES(V)是一个类函数宏,它将另一个类函数宏V作为参数。我没有看到以下内容:
1- PER_ISOLATE_STRING_PROPERTIES(V)被赋予了多个定义,我不明白这些是如何在代码中使用的(例如,当PER_ISOLATE_STRING_PROPERTIES(V)在代码中被预处理器看到时,它如何知道V的哪个定义来替换它?)
2-我不明白V函数是怎么用的
让我们只对以下代码运行处理器:
// Strings are per-isolate primitives but Environment proxies them
// for the sake of convenience.
#define PER_ISOLATE_STRING_PROPERTIES(V)
V(address_string, "address")
V(args_string, "args")
V(argv_string, "argv")
V(async, "async")
#define V(PropertyName, StringValue)
inline v8::Local<v8::String> PropertyName() const;
PER_ISOLATE_STRING_PROPERTIES(V)
#undef V
gcc - E code.cpp
输出:
inline v8::Local<v8::String> address_string() const; inline v8::Local<v8::String> args_string() const; inline v8::Local<v8::String> argv_string() const; inline v8::Local<v8::String> async() const;
c++是一种不敏感空格的语言,所以它本质上是这样的:
inline v8::Local<v8::String> address_string() const;
inline v8::Local<v8::String> args_string() const;
inline v8::Local<v8::String> argv_string() const;
inline v8::Local<v8::String> async() const;
这种技术被称为X宏
就我个人而言,我不认为列出所有不能轻松放入for循环的代码有什么害处,但是您可以看到如何使用这种技术来避免一次又一次地指定函数签名的其余部分。宏不服从作用域,我宁愿进行搜索和替换来进行更改,而不是使用宏。仅仅是你问了这个问题,就证明了它也阻碍了可读性。
tldr; 处理器被用来生成代码。
相关文章:
- 通过函数指针定义类范围之外的方法
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 在类构造函数中定义结构变量的参数
- 2个模板化类的非模板友元函数未定义引用错误
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 使用宏调用类函数
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 构造函数中定义的类函数的默认参数
- 何时在类中检查函数的定义?
- Qt基类函数定义
- 类中未定义的函数
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 从一个函数和某些类型指定符定义整个派生类的宏
- 类定义之外的静态类函数的定义
- 在类函数宏中添加预处理器指令是错误的吗?
- c++:复杂的类函数宏定义
- 为类函数宏调用提供的参数太多