2016-08-22 6 views
3

オペレーターがマクロにどのように渡すのかと思います。 glibソース(glib/testutils.h)のマクロです。オペレーターの説明があるマクロ

コードでは、アサートをg_assert_cmpint(1, ==, 2);としているので、演算子はそのまま渡されます。使い方?このマクロで#トークンは何を意味しますか?

#define g_assert_cmpint(n1, cmp, n2)     \ 
    G_STMT_START {          \ 
    gint64 __n1 = (n1), __n2 = (n2);     \ 
    if (__n1 cmp __n2) ;        \ 
    else            \ 
     g_assertion_message_cmpnum(     \ 
     G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ 
     #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); \ 
    } G_STMT_END 

g_assert_message_cmpnumようなインターフェースを持っています

void g_assertion_message_cmpnum(const char *domain, \ 
           const char *file,\ 
           int line,\ 
           const char func,\ 
           const char *expr,\ 
           long double arg1, \ 
           const char *cmp,\ 
           long double arg2,\ 
           char numtype); 

これは#は、文字列にcmpオペレータに変換することを意味するのでしょうか?

しかし、この行を理解するには#n1 " " #cmp " " #n2マクロから?

答えて

1

はい#は、 "文字列化" です。

次に、前処理後の後の段階で、すべての隣接する文字列リテラルが1つの大きな文字列に結合されます。

3

マクロはコンパイル時に処理されるため(プリプロセッサ段階)、したがって、単にcmpを渡された演算子に「置き換え」ます。 "マクロ"の使用はチェックされたタイプを実行しないため、安全ではありません。怒鳴る

例:プリプロセッサで

#define DOUBLE(x) x << 1 /// shift 1 bit left = multiple by 2 

cout << DOUBLE(5) << endl; /// result "51" instead of "10" 
/// because the result of processed code is: 
cout << 5 << 1 << endl; 
+5

OPは、CoutとendlがC言語で動作するのに苦労します。(残りの答えは私が同意します) –

+1

これは答えではありません。 –