[英]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") \
...
这样会持续一段时间。 我在代码中往下看,看如何使用它。
#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; 处理器用于生成代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.