【问题标题】:Show #pragma message in header only once during build在构建期间仅在标题中显示 #pragma 消息一次
【发布时间】:2016-06-08 08:43:16
【问题描述】:

我在config.h 标头中有一堆#pragma message("A message")s,它们包含在项目的许多地方;目标是告知在构建期间选择了哪些配置选项。标头受#ifndef #define 样式标头保护。问题是每次包含此标头时,都会打印消息。有没有更好的方法来做到这一点,以便在构建过程中只打印一次消息?

编辑:我了解构建选项通常是使用 cmake、qmake、autotools 等构建工具来操作和查看的,但由于项目的性质。

【问题讨论】:

  • AFAIK 这是不可能的 #pragma message
  • 您需要能够在不同编译单元之间传递已打印消息的信息。这似乎异常困难。我宁愿写一个脚本来过滤掉输出中的重复行。
  • @GillBates 还有什么解决方案可以在构建期间打印配置选项?
  • 那么构建工具是什么?例如,这对于 GNU make 来说并不是很困难,或者即使构建系统只是一个 shell 脚本。也许优化你的标签?
  • @MikeKinghan 构建工具是 Microchip 专有的,并且已经非常损坏且不稳定。我不敢孤立或编写集成了他们工具的脚本供我自己使用。我同意,也许对这个特定问题的任何(部分)答案在一般情况下都没有用,甚至这种情况也无济于事,因为打印这种类型的消息不是编译器的工作。

标签: c gcc c-preprocessor pragma


【解决方案1】:

您可以将#pragma message 放在一个单独的文件中,您只包含一次来自config.h 的文件。即使在错误条件中,gcc 也可能会打印这些编译指示,但它不会包含错误条件中的文件。所以是这样的:

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H

#ifndef CONFIG_MESSAGE_PRINTED
#define CONFIG_MESSAGE_PRINTED
#include "config_message.h"
#endif

/* ... */
#endif /* CONFIG_H */

config_message.h:

#pragma message("A message")

【讨论】:

  • 为什么CONFIG_MESSAGE_PRINTED 包含保护的行为与CONFIG_H 不同?
  • @KarstenKoop 它没有,但是错误条件中的include 指令被忽略。
  • 我认为他的问题不是来自同一个编译单元的多个包含,而是具有相同的不同编译单元包含产生相同的消息。但由于问题并不完全清楚,他也可能指的是同一个编译单元,在这种情况下你的回答可能会有所帮助。
  • 我的回答确保包含消息杂注的文件只包含一次。这样可以确保只打印一次。
  • @FUZxxl 我认为问题出在多个编译单元上,因为这不起作用,消息仍会打印多次。
【解决方案2】:

受@fuz 启发,也许我们可以将#pragma message 写在一个单独的.c 文件中。 示例如下:

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H

#define CONFIG_OPTION_A
#define CONFIG_OPTION_B

#endif /* CONFIG_H */

.c 文件中写入消息:

/* config_msg.c */
#include "config.h"

#ifdef CONFIG_OPTION_A
#pragma message "Config option A is enabled!"
#endif

#ifdef CONFIG_OPTION_C
#pragma message "Config option C is enabled!"
#endif

最后在Makefile中添加编译依赖(即config_msg.o):

/* Makefile */
.PHONY: all
%.o: %.c
    gcc -c -o $@ $<
config_msg.o: config_msg.c config.h
    gcc -c -o $@ $<
all: main.o config_msg.o
    gcc -o main $^

只要修改了config.hconfig_msg.o就会重新编译并打印其中的消息。 (将config.h 添加到Rule config_msg.o 的依赖项中是必要的。这也取决于Rule config_msg.o 的优先级高于Rule %.o。如果我错了,请纠正我。)

这是测试:

$ make all
gcc -c -o main.o main.c
gcc -c -o config_msg.o config_msg.c
config_msg.c:4:9: warning: Config option A is enabled! [-W#pragma-messages]
#pragma message "Config option A is enabled!"
        ^
1 warning generated.
gcc -o main main.o config_msg.o
$ make all
gcc -o main main.o config_msg.o

#define CONFIG_OPTION_C添加到config.h后运行:

$ make all
gcc -c -o config_msg.o config_msg.c
config_msg.c:4:9: warning: Config option A is enabled! [-W#pragma-messages]
#pragma message "Config option A is enabled!"
        ^
config_msg.c:8:9: warning: Config option C is enabled! [-W#pragma-messages]
#pragma message "Config option C is enabled!"
        ^
2 warnings generated.
gcc -o main main.o config_msg.o

我认为这不是一个完美的解决方案。但希望它会有所帮助。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多