C ++:类似复杂函数的宏定义

时间:2015-05-23 17:44:00

标签: c++ node.js macros

在阅读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函数。

1 个答案:

答案 0 :(得分:0)

让我们只通过以下代码运行处理器:

// 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 Macros

就个人而言,我没有看到列出你不能轻易放入for循环的所有代码的危害,但你可以看到如何使用这种技术来避免指定其余的功能签名一次又一次。宏不遵守范围,我更愿意进行搜索和替换以进行更改,然后使用宏。事实上,您提出了一个有关此问题的事实,证明它也妨碍了可读性。

<强> tldr; 处理器用于生成代码。