加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c 11模式中奇怪的g预处理器行为

发布时间:2020-12-16 03:46:22 所属栏目:百科 来源:网络整理
导读:我有一个问题,当g在c 11模式下运行时,一些预处理器宏未扩展正确.这使我在使用Qt编译程序时遇到麻烦. $g++ --versiong++ (GCC) 4.7.2Copyright (C) 2012 Free Software Foundation,Inc.This is free software; see the source for copying conditions. There
我有一个问题,当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 ""__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" """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" ""__FILE__":"QTOSTRING(15))

这种行为是否有意,我该怎么做才能启用扩展?

解决方法

这是一个已知问题,新的GCC行为是有意的,因为新的C 11特征,即用户定义的文字.您可以在__FILE__和QTOSTRING之前插入一个空格,以确保它始终被视为一个单独的标记,从而进行扩展.

QT bugreport here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读