2016-08-22 4 views
3

Ich frage mich, wie Operator in Makros funktioniert. Sie sind Makros aus glib-Quellen (glib/testutils.h).C Makros mit Operator Erklärung

Im Code verwenden Sie assert als g_assert_cmpint(1, ==, 2);, so Operator wie übergeben wurde. Wie es funktioniert? Was bedeutet Token in diesem Makro?

#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 

und g_assert_message_cmpnum hat eine solche Schnittstelle:

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); 

bedeutet das, dass # wandelt cmp Operator in einen String?

Aber dann, wie man diese Linie #n1 " " #cmp " " #n2 von einem Makro versteht?

Antwort

1

Ja # im Preprocessor ist "stringification".

Dann werden in einer späteren Phase nach der Vorverarbeitung alle benachbarten Zeichenfolgenliterale zu einer großen Zeichenfolge verbunden.

3

Weil Makros vor der Kompilierzeit verarbeitet werden (Präprozessorstufe). Es würde also cmp einfach mit dem übergebenen Operator "ersetzen". Die Verwendung von "Makros" ist nicht übernommen, da der Typ nicht überprüft wird.

Beispiel unten:

#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

Das OP wird es schwer haben, 'cout' und' endl' in C zu arbeiten. (Der Rest Ihrer Antwort stimme ich zu) –

+1

Dies ist keine Antwort. –