c++:复杂的类函数宏定义

C++: complex function-like macro definition

本文关键字:类函数 宏定义 复杂 c++      更新时间:2023-10-16

在阅读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; 处理器被用来生成代码。