在编译时打印静态分配的数组内容

Print statically allocated array contents at compile time

在 C 中,如果包含各种数组元素由 #define 值确定,是否可以打印(在编译时)静态定义数组的内容?

我看到很多关于 #pragma message 的问题(似乎很有帮助),但是 none 关于如何做我想做的事情的问题(尽管我可能正在寻找错误的东西)。

这是我想要完成的:

我正在使用一个大型的第 3 方开源库,该库(除其他外)包含大量信息,数组的内容永远不会改变,数组的长度取决于是否 (吨和吨)预处理器符号被定义。我需要能够打印在编译时数组包含的内容。

这里有一个非常小的程序来展示我所得到的要点:

#include "stdlib.h"
#include "stdio.h"

// there are tons of these, some of which are conditionally defined based on tons of other defines. 
// All are defined in other header files and none are defined via the command line, i.e. via `-DTHREE`.
#define ONE
#define TWO
// ...

int main()
{
  int values[] = {
#ifdef ONE
  1,
#endif
#ifdef TWO
  2,
#endif
#ifdef THREE
  3,
#endif
#ifdef FOUR
  4,
#endif
#ifdef FIVE
  5,
#endif
  0
  };
  int i = 0;

  for (i = 0; values[i] != 0; i++)
  {
    printf("values[%d] = %d\n", i, values[i]);
  }
  return 0;
}

显然,如果我编译此代码(使用 gcc)和 运行 然后我得到输出:

values[0] = 1
values[1] = 3

但是,我想知道值 1 和 3 在编译时 存在于数组中 。需要明确的是,我不关心任何特定值是否在数组中;我只想知道数组 中的实际内容,而不必 运行 二进制 。理想情况下,我的工作流程是编译代码并在输出中搜索特殊格式的消息,这些消息会告诉我数组包含什么。代码应该始终编译,因为我的意图是添加的诊断将告诉我 关于 二进制文件不会阻止它编译,如果它包含或不包含某些东西。

我已尝试执行以下操作:

  // ...
#ifdef ONE
#pragma message "1 is included"
  1,
#endif
  // ...

这会导致编译错误(error: expected expression before '#pragma')

  // ...
#ifdef ONE
#warning "1 is included"
  1,
#endif
  // ...

效果很好但是一旦我使用-Werror(我需要这样做)编译就失败了。

任何关于如何实现这一点的想法都会很棒。

UPDATE/CLARIFICATION: 在我的简单示例中,围绕每个元素包含的 #ifdef 守卫只是检查单个符号。这并不反映实际代码;实际代码的预处理器保护检查很多很多符号以确定是否应该包含单个数组元素。因此,检查符号列表以确定列表中的内容对我来说是不切实际的,因为我实际上必须重复复杂的预处理器符号检查。

message pragma 的典型用途是在编译时显示信息性消息。但是你忘记了 ( ) 中的 pragma massage ..... 就像这样使用 #pragma message("1 is included") 更多信息请参阅 vc++ message pragma

我必须“让一些东西工作”所以我最终做了以下事情:

我写了一个 python 脚本来解析包含巨型数组的文件,其中包含 #if defined(...) 逻辑,并生成结构相同的 #ifdef 代码块,而不是定义数组元素将使用 #pragma message 来输出有关包含在数组中的元素的信息。

然后将生成的预处理器日志记录添加到数组定义上方的相关源文件中,并带有非常明显的注释,说明它是什么以及在数组定义发生更改时如何重新生成它。

理想情况下,我会将 python 脚本集成到我的构建系统中,以便自动重新生成日志记录代码,这样它就永远不会与数组定义不同步。