Firebird 的 gpre 工具为 gds__null 创建一个静态定义 - 我如何摆脱 'defined but not used' 编译器警告?

Firebird's gpre tool creates a static definition for gds__null - how do I get rid of 'defined but not used' compiler warning?

Firebird 的 C 预处理器 gpre 在它从我的 .e 源代码生成的 C 代码中创建了以下定义文件:

static const ISC_STATUS *gds__null = 0;    /* dummy status vector */

我没有在我的代码中的任何地方使用这个值。也许我应该是,但我似乎没有任何需要(欢迎就其适当使用提出任何建议)。在任何情况下,由于我没有使用该变量,我从 gcc 收到以下编译器警告:

warning: 'gds__null' defined but not used

我想知道是否有某种方法可以告诉编译器我不会在代码中使用此变量的值(请记住定义是由 gpre 预处理器;我无法更改定义)或通过命令行参数传递给编译器。或者如果我们不使用它,也许有一些方法可以指示 gpre 不要将这个定义注入代码中。我想保留其他未使用的变量警告,所以 -Wno-unused 不是一个选项。

解决方案 here 有点工作,因为我可以将以下内容插入到我的 .e 源文件中的任意函数中,它消除了警告:

(void) gds__null;

但是,将此行任意放入一个函数中似乎并不优雅,因为它没有任何明确的目的,只是为了摆脱编译器警告。我希望有更好的解决方案。我的最后一招是对生成的 C 文件 post-gpre/pre-gcc 进行一些 sed 替换,但我希望不要发展到那个地步。

告诉 gcc 抑制特定变量的未使用变量警告的方法是在其声明中添加 __attribute__((unused))

您可以使用预处理器注入此属性:

-Dgds__null="gds__null __attribute__((unused))"

或者,避免在命令行参数中使用空格:

-Dgds__null=(gds__null)__attribute__((unused))

如果您最终按预期使用该变量,这当然会中断。

最好添加一个专门用于抑制警告的功能;这本身必须抑制其自己未使用的功能警告:

static void suppress_unused_warnings() {
  (void) suppress_unused_warnings;
  (void) gds__null;
}