【问题标题】:GNU g++ preprocessor/compiler: printf valueGNU g++ 预处理器/编译器:printf 值
【发布时间】:2020-01-30 10:40:29
【问题描述】:

您好,我正在寻找 GCC 的解决方案来打印在编译期间计算的值。

有消息杂注,但它们只能打印用户输入字符串。我正在寻找的是一个 printf 样式的输出,我可以在其中输入参数。

示例

printf("hi %s, my value is %d\n", "john", 15);

示例 2:为此搜索解决方案

void dummy(MyObjectReference & obj)
{
#if(sizeof(obj) != 512)
#pragma message "cannot build, your object size is not 512, it is %d", sizeof(obj)
#error "stop build"
#endif

  obj.do_stuff();

  return obj.get_result();
}

【问题讨论】:

标签: c++ gcc c-preprocessor


【解决方案1】:

您好,我正在寻找 GCC 的解决方案来打印在编译期间计算的值。

你不能用标准的GCC 9来做到这一点。

您可以考虑编写自己的GCC plugin,例如提供一些额外的#pragma(或内置GCC)来做您想做的事情。

但是,开发这样的插件可能需要您花费数周的时间。您需要了解 GCC 内部结构才能编写该插件。所以看看GCC resourcecenter。

使用 C++11 或更高版本,您可以使用 use static_assert(sizeof(obj) == 512, "bad size of obj") 进行 after 预处理(但不会将 sizeof(obj) 显示为整数)。

【讨论】:

  • static_assert 也存在于 C++11 中。请注意,在 C++17 之前,您还必须提供一条消息(即static_assert(sizeof(obj) == 512, "unexpected obj size"))。但这不会解决 OP 的问题,因为所述消息必须是字符串文字。
  • 是的,我使用静态断言 (cpp14)。但是在失败的情况下打印的任何消息,无论是编译指示还是断言字符串,都不能将带有 int 参数的字符串格式化为简单的 printf。所以应该可以告诉我“静态断言失败,obj 不是 512,它实际上只是 496 之类的。
  • 你可以考虑用你自己的插件扩展 GCC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
相关资源
最近更新 更多