2013-05-06 7 views
6

Ich habe das Problem, dass, wenn g ++ im C++ 11-Modus ausgeführt wird, einige Pro-Prozessor-Makros nicht korrekt erweitert werden. Dies verursacht Probleme beim Kompilieren von Programmen mit Qt.Weird g ++ - Präprozessor-Verhalten in C++ 11-Modus

$ g++ --version 
g++ (GCC) 4.7.2 
Copyright (C) 2012 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

Die folgende snipped macht das Problem:

$ cat foo.cpp 
//#include <QtGui> 
#define QTOSTRING_HELPER(s) #s 
#define QTOSTRING(s) QTOSTRING_HELPER(s) 
#ifndef QT_NO_DEBUG 
# define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__) 
# define METHOD(a) qFlagLocation("0"#a QLOCATION) 
# define SLOT(a)  qFlagLocation("1"#a QLOCATION) 
# define SIGNAL(a) qFlagLocation("2"#a QLOCATION) 
#else 
# define METHOD(a) "0"#a 
# define SLOT(a)  "1"#a 
# define SIGNAL(a) "2"#a 
#endif 

METHOD(grml) 

es ohne C++ 11 nicht das Richtige Preprocesing.

$ g++ -E foo.cpp 
# 1 "foo.cpp" 
# 1 "<command-line>" 
# 1 "foo.cpp" 
# 15 "foo.cpp" 
qFlagLocation("0""grml" "\0""foo.cpp"":""15") 

Aber in C++ 11-Modus der QTOSTRING Makro erweitert bekommt nicht, einen Compiler-Fehler an der Source-Leitung verursacht.

Ist dieses Verhalten beabsichtigt, und was kann ich tun, um die Erweiterung zu aktivieren?

+2

Für das nächste Mal: ​​Fügen Sie immer die tatsächlichen Fehler ein. – Xeo

Antwort

9

Dies ist ein bekanntes Problem und das neue GCC-Verhalten ist absichtlich als Ergebnis einer neuen C++ 11-Funktion, nämlich benutzerdefinierte Literale. Sie können ein Leerzeichen vor __FILE__ und einfügen, um sicherzustellen, dass es immer als separates Token behandelt und somit erweitert wird.

QT bugreport here.