如何隐藏#pragma消息的额外输出

son*_*ave 6 gcc pragma c-preprocessor

当前状态

在gcc bugtracker中提交的bug(包括简单的测试用例):https://gcc.gnu.org/bugzilla/show_bug.cgi id = 66234


我目前正在将一些代码移植到一个新的平台和工具链,其中包括从gcc 4.7.2升级到gcc 4.9.2(或者更具体地说,从2012年到2012年的OSELAS工具链升级 - 我也重现了这一行为在我的主机上与gcc 4.6.4(工程)和gcc 4.8.3(不起作用)).

在构建应用程序期间,我使用一些#pragma message语句来输出builddate和hostname(注意,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)
Run Code Online (Sandbox Code Playgroud)

旧工具链(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
Run Code Online (Sandbox Code Playgroud)

但是,新的工具链(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)
                                ^
Run Code Online (Sandbox Code Playgroud)

(请注意,我已从两个列表中的输出中删除了文件路径/位置.)

当然,我想要的输出就在那里,但也有很多额外的东西.有没有在保持所需输出的同时隐藏附加in definition of macro/ in expansion of macro/等消息?

或者我只是以错误的方式这样做,是否有更好的方法来打印消息?

Tim*_*Tim 9

简短回答

要隐藏额外的输出,请传递GCC 4.8 版本中添加的-ftrack-macro-expansion=0和选项。-fno-diagnostics-show-caret

长答案

这看起来像是 GCC 中的一个错误,您可能需要报告该错误。它看起来与此错误相同或相关。

我发现能够使用普通(从源代码构建)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)
                                 ^
Run Code Online (Sandbox Code Playgroud)

请注意,它仅在 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)
                                 ^
Run Code Online (Sandbox Code Playgroud)

GCC 4.8 的更改日志中,它显示-ftrack-macro-expansion=2现在默认通过,这解释了为什么版本 4.7.2 中不存在此行为。

-fno-diagnostics-show-caret如果你想得到与 4.7.2 相同的输出,你也可以通过(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
Run Code Online (Sandbox Code Playgroud)

  • 是的,添加 -ftrack-macro-expansion=0 -fno-diagnostics-show-caret 效果很好,但我怀疑它可能会隐藏一些我在调试宏时确实想看到的消息(幸运的是我不必这样做)但经常)。但目前,解决方法有效,我在这里提交了 gcc 的错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66234 (4认同)