6

g++ を c++11 モードで実行すると、一部のプロプロセッサ マクロが正しく展開されないという問題があります。これにより、Qt を使用したプログラムのコンパイル中に問題が発生します。

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

次の抜粋で問題が明らかになります。

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

C ++ 11を使用せずに前処理すると、正しいことが行われます。

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

この動作は意図されたものですか? また、拡張を有効にするにはどうすればよいですか?

4

1 に答える 1

9

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

QTバグレポートはこちら

于 2013-05-06T10:00:34.097 に答える