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

标签 gcc c-preprocessor pragma

当前状态

提交到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语句输出构建日期和主机名(请注意BUILDTAGBUILDHOST也存储为常量,供应用程序随后使用):

#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/

相关文章:

c - 调试段错误——程序总是按它应该的方式运行,但总是出现段错误

c - 从同一编译单元覆盖 C 中的函数调用

c++11 - 为什么std::chrono::time_point的大小不足以存储struct timespec?

c++ - 将许多头文件包含在一起而不会产生错误

c++ - GCC 可以配置为忽略#pragma 指令吗?

c - 关于库中已弃用的全局变量使用的 GCC 消息

从 gcc 到 Visual Studio Express 2010 的 C 代码

c++ - #line 是什么意思?

另一个文件中的 C++ 替换宏

c - 添加两个宏并在预处理阶段转换为字符串