gpt4 book ai didi

c++ - c++11 模式下奇怪的 g++ 预处理器行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:49 26 4
gpt4 key购买 nike

我遇到的问题是,当 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))

这是有意为之的行为吗?我该怎么做才能启用扩展?

最佳答案

这是一个已知问题,新的 GCC 行为是有意为之的,这是新的 C++11 功能(即用户定义文字)的结果。您可以在 __FILE__QTOSTRING 之前插入一个空格,以确保它始终被视为单独的标记并因此展开。

QT bugreport here .

关于c++ - c++11 模式下奇怪的 g++ 预处理器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com