[英]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.