2015-05-23 3 views
0

При чтении исходного кода node.js я столкнулся с макросом, который я просто не могу понять.C++: сложное определение типа функции

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

+4

См. [X Макросы] (http://en.wikipedia.org/wiki/X_Macro). – chris

+0

Вы можете использовать 'gcc -E', чтобы увидеть результат после препроцессора. – timrau

ответ

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

Лично я не вижу вреда в пречисление весь код, который вы не можете легко положить внутрь для цикла, но вы можете увидеть, как эта техника используется, чтобы избежать повторного указания остальной части сигнатуры функции. Макросы не подчиняются области, и я бы скорее сделал поиск и заменил, чтобы внести изменения, а затем играть с макросами. Просто тот факт, что вы задали вопрос об этом, доказывает, что это также мешает читаемости.

tldr; Процессор используется для генерации кода.