2015-07-31 9 views
10

Warum kompiliert das nicht?Verwenden von Makro mit Zeichenfolge schlägt auf VC 2015 fehl

char programDate[] = "("__DATE__")"; 

Aber dies stellt in Ordnung (siehe Raum):

char programDate[] = "(" __DATE__")"; 

I VC2015 wissen unterstützt jetzt literal-Operatoren. Aber sollte das nicht in der Kompilierungsphase sein? __DATE__ sollte vom Pre-Prozessor verarbeitet worden sein. Was geht hier vor sich?

Ich dachte an einige Mix-Match-Problem mit Unicode/Nicht-Unicode-Build - aber es hilft nicht. Es ist nicht nur Problem mit vordefinierten Makros, aber mit Benutzer auch definiert:

#define MACRO "abc" 
char data[] = "("MACRO")"; 

EDIT:

Error C3688 invalid literal suffix '__DATE__'; literal operator or literal operator template 'operator ""__DATE__' not found 
+0

Ich denke, Sie können etwas in Ihrem Kommentar über benutzerdefinierte Literale sein. Im Allgemeinen sind C++ Parser ** maximal munch **, für jedes Token schlucken sie so viele Zeichen wie möglich, bis es kein gültiges Token mehr ist. –

+0

Sie könnten den Kompilierungsfehler schreiben. –

Antwort

18

Da C++ 11, benutzerdefinierte Literale existieren und sind Teil der Vorverarbeitung . Die Grammatik ist:

preprocessing-token: 
    user-defined-string-literal 
    // other stuff... 

user-defined-string-literal: 
    string_literal ud-suffix 

ud-suffix: 
    identifier 

So "("__DATE__ passt Vorverarbeitung-Token, aber "("__DATE__ nicht (dh zwei getrennte Vorverarbeitung Token).

Der Makroaustausch erfolgt nach der Tokenisierung. Da in Ihrem ersten Beispiel kein Token __DATE__ vorhanden ist, gibt es keinen Ersatz.

+1

Falls jemand nicht bemerkt hat, dass der C++ - Präprozessor vom C-Präprozessor abweicht ... jetzt tun Sie das :) –

+4

Mit C++ 11 benutzerdefinierten Literalen in VS 2015 können Sie auch Probleme mit '' L '' Hallo haben , "L" World "" würde früher funktionieren, scheitert aber mit demselben Fehler, weil es versucht, das zweite L als UDF zu verwenden. Du behebst es mit Leerzeichen: '' L 'Hallo, "L" Welt "' ' –

+0

Und zum Glück jetzt nicht übereinstimmende Zeichenfolgen können verkettet werden - so zweiten' L' wird nicht benötigt! (http://stackoverflow.com/questions/31809141/concatenating-mismatched-string-works-in-vc2015-how) – Ajay