2013-05-06 13 views
6

g ++をC++ 11モードで実行すると、一部のプロセッサマクロが正しく展開されないという問題があります。これはQtを使ったプログラムのコンパイル時に問題を引き起こします。 C++ 11せずに正しいことをする、それをんPreprocesingC++ 11モードで奇妙なg ++プリプロセッサの動作

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

$ 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. 

次スニップは、問題を公開しています。

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

しかし、C++ 11モードでは、QTOSTRINGマクロは展開されず、ソース行でコンパイルエラーが発生します。

$ g++ -std=c++11 -E foo.cpp 
# 1 "foo.cpp" 
# 1 "<command-line>" 
# 1 "foo.cpp" 
# 15 "foo.cpp" 
qFlagLocation("0""grml" "\0"__FILE__":"QTOSTRING(15)) 

この動作が意図されていますが、展開を有効にするにはどうすればよいですか?

+2

次回は必ず実際のエラーを含めてください。 – Xeo

答えて

9

これは既知の問題です。新しいGCCの動作は、新しいC++ 11の機能、つまりユーザー定義リテラルの結果として意図的です。 __FILE__QTOSTRINGの前にスペースを挿入して、常に別のトークンとして扱われ、拡張されるようにすることができます。

QT bugreport here