$g++ --versiong++ (GCC) 4.7.2copyright (C) 2012 Free Software Foundation,Inc.This is free software; see the source for copying conditions. There is NOwarranty; 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 "$g++ -E foo.cpp# 1 "foo.cpp"# 1 "<command-line>"# 1 "foo.cpp"# 15 "foo.cpp"qFlagLocation("0""grml" ""__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#endifMETHOD(grml)$g++ -std=c++11 -E foo.cpp# 1 "foo.cpp"# 1 "<command-line>"# 1 "foo.cpp"# 15 "foo.cpp"qFlagLocation("0""grml" ""__file__":"QTOSTRING(15))""foo.cpp"":""15")
在没有c 11的情况下对其进行预处理是正确的.
但是在C 11模式下,QTOSTRING宏不会扩展,导致源代码行出现编译错误.
这种行为是否有意,我该怎么做才能启用扩展?
解决方法 这是一个已知问题,新的GCC行为是有意的,因为新的C 11特征,即用户定义的文字.您可以在__file__和QTOSTRING之前插入一个空格,以确保它始终被视为一个单独的标记,从而进行扩展.QT bugreport here.
总结以上是内存溢出为你收集整理的c 11模式中奇怪的g预处理器行为全部内容,希望文章能够帮你解决c 11模式中奇怪的g预处理器行为所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)