当前状态
提交到gcc bugtracker中的错误(包括简单的测试用例):https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66234
目前,我正在将一些代码移植到新的平台和工具链上,其中包括从gcc 4.7.2升级到gcc 4.9.2(或更具体地说,是OSELAS toolchains从2012年发布到2014年的版本-我还重现了我的带有gcc 4.6.4的主机(可以工作)和gcc 4.8.3(不起作用))。
在构建应用程序期间,我使用一些#pragma message
语句输出构建日期和主机名(请注意BUILDTAG
和BUILDHOST
也存储为常量,供应用程序随后使用):
#define BUILDTAG (__DATE__ " " __TIME__)
#define BUILDHOST BUILT_ON
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#pragma message "Setting builddate to: " STR(BUILDTAG)
#pragma message "Building on: " STR(BUILDHOST)
旧的工具链(gcc 4.7.2/4.6.4)输出以下内容,这正是我想要的:
note: #pragma message: Setting builddate to: ("May 15 2015" " " 10:35:12")
note: #pragma message: Building on: my-host
但是,新的工具链(gcc 4.9.2/4.8.3)为我提供了:
note: #pragma message: Setting builddate to: ("May 15 2015" " " "10:39:35")
#pragma message "Setting builddate to: " STR(BUILDTAG)
^
note: in definition of macro 'STR_HELPER'
#define STR_HELPER(x) #x
^
note: in expansion of macro 'STR'
#pragma message "Setting builddate to: " STR(BUILDTAG)
^
note: #pragma message: Building on: my-host
#pragma message "Building on: " STR(BUILDHOST)
^
note: in definition of macro 'STR_HELPER'
#define STR_HELPER(x) #x
^
note: in expansion of macro 'STR'
#pragma message "Building on: " STR(BUILDHOST)
^
(请注意,我已经从两个 list 的输出中删除了文件路径/位置。)
当然,我想要的输出在那里,但是也有很多额外的东西。无论如何,在保持所需输出的同时隐藏其他
in definition of macro
/in expansion of macro
/等消息?还是我只是以错误的方式执行此操作,是否有更好的方法来打印出消息?
最佳答案
简短答案
要隐藏额外的输出,请传递在GCC版本4.8中添加的-ftrack-macro-expansion=0
和-fno-diagnostics-show-caret
选项。
长答案
这看起来像是GCC中的错误,您可能需要报告。它看起来与this bug相同或相关。
我发现能够使用GCC 4.9.2版本(从源构建)复制它:
$ cat test.c
#define BUILDTAG (__DATE__ " " __TIME__)
#define BUILDHOST BUILT_ON
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#pragma message "Setting builddate to: " STR(BUILDTAG)
#pragma message "Building on: " STR(BUILDHOST)
$ g++ -c test.c
test.c:7:1: note: #pragma message: Setting builddate to: ("May 18 2015" " " "14:36:12")
#pragma message "Setting builddate to: " STR(BUILDTAG)
^
test.c:4:24: note: in definition of macro 'STR_HELPER'
#define STR_HELPER(x) #x
^
test.c:7:42: note: in expansion of macro 'STR'
#pragma message "Setting builddate to: " STR(BUILDTAG)
^
test.c:8:46: note: #pragma message: Building on: BUILT_ON
#pragma message "Building on: " STR(BUILDHOST)
^
test.c:4:24: note: in definition of macro 'STR_HELPER'
#define STR_HELPER(x) #x
^
test.c:8:33: note: in expansion of macro 'STR'
#pragma message "Building on: " STR(BUILDHOST)
^
请注意,它仅在C++预处理器(即
g++
而不是gcc
)中发生,并且如果您传递-ftrack-macro-expansion=0
就会消失:$ gcc -c test.c
test.c:7:9: note: #pragma message: Setting builddate to: ("May 18 2015" " " "14:36:17")
#pragma message "Setting builddate to: " STR(BUILDTAG)
^
test.c:8:9: note: #pragma message: Building on: BUILT_ON
#pragma message "Building on: " STR(BUILDHOST)
^
$ g++ -c test.c -ftrack-macro-expansion=0
test.c:7:42: note: #pragma message: Setting builddate to: ("May 18 2015" " " "14:36:35")
#pragma message "Setting builddate to: " STR(BUILDTAG)
^
test.c:8:33: note: #pragma message: Building on: BUILT_ON
#pragma message "Building on: " STR(BUILDHOST)
^
在change log for GCC 4.8中,它表明默认情况下现在传递了
-ftrack-macro-expansion=2
,这说明了为什么在4.7.2版中不存在此行为。如果您希望获得与4.7.2相同的输出,也可以传递
-fno-diagnostics-show-caret
(在GCC 4.8中也添加了):$ g++ -c test.c -ftrack-macro-expansion=0 -fno-diagnostics-show-caret
test.c:7:42: note: #pragma message: Setting builddate to: ("May 18 2015" " " "14:39:48")
test.c:8:33: note: #pragma message: Building on: BUILT_ON
关于gcc - 如何隐藏#pragma消息中的额外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30255294/