2017-01-12 4 views
-1

Ich habe Code:Multipass-Präprozessor in MSVC?

#define __IGNORE__(...) 
#define XUJ(x)); if (x) { test2(); } __IGNORE__(0 

void test2() { 

} 

void test() { 

} 

int main() { 
    int x = 0; 
    test(XUJ(x)); 
    return 0; 
} 

GCC kompiliert, aber cl.exe hat Fehler:

$ cl 1.cpp 
1.cpp(14): error C2059: syntax error: ; 

Aber ... wenn ich Makros zu entpacken:

test(); if (x) { test2(); } __IGNORE__(0); 

Es kompiliert normaly . MSVC 2015 Compiler unterstützt Multipass Preprozessor nicht? O_O

upd: hm .... wo Klammern? o_O

$ cl /E 1.cpp 

1.cpp 
#line 1 "1.cpp" 



    void test2() { 

    } 

    void test() { 

    } 

    int main() { 
     int x = 0; 
     test(); if (x) { test2(); } ; 
     return 0; 
    } 
+1

, dass Sie die neuesten Updates für Ihren Compiler. Testen Sie auch mit VS2017, und wenn einer oder beide den Fehler wiederholen, reichen Sie einen Fehlerbericht über Microsoft Connect ein. – rubenvb

+1

Ich bekomme die Downvotes nicht. Die Frage ist vielleicht nicht gut geschrieben und enthält viele Smilies, aber das Problem ist klar erkennbar und OP lieferte sogar einen MCVE. –

Antwort

-2

Seine seltsame Fehler MSVC -_-

Ich bewege 0 bis Makros - Fehler behoben -_-

#define KEEEK 0 
#define __IGNORE__(...) 
#define XUJ(x)); if (x) { test2(); } __IGNORE__(KEEEK 

void test2() { 

} 

void test() { 

} 

int main() { 
    int p = 0; 
    test(XUJ(p)); 
    return 0; 
} 
+0

Ich bin nicht überzeugt, dass es ein Fehler ist. Die Regeln für die Makroexpansion sind nicht intuitiv offensichtlich, aber es ist zu lange her, dass ich mich damit beschäftigt habe, eine Antwort zu geben. –

+0

Das Entfernen der '0' funktioniert genauso gut und erfordert kein weiteres' # define'. –

+0

Oder ein zusätzliches Klammerpaar hinzufügen: '#define XUJ (x)); if (x) {test2(); } __IGNORE __ ((0) ' –