8

我有一个 C 程序,其中有几个(尚未)使用的静态函数。我想禁用这些特定功能的警告。我不想禁用所有-Wunused-function警告。我正在使用 GCC 4.6。具体来说:

gcc --version

gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我正在遵循文档中的建议(使用pushand pop),但我无法让它工作。

我创建了一些简化的源代码来调查这个问题。我正在用gcc -Wall -o pragma pragma.c(where pragma.c) 编译它们。我的第一个版本pragma.c看起来像这样:

void foo(int i) { }
static void bar() { }
int main() { return 0; }

正如预期的那样,我在编译时得到了这个:

pragma.c:3:13: warning: ‘bar’ defined but not used [-Wunused-function]

同样如预期的那样,我可以禁用这样的警告(然后编译成功):

#pragma GCC diagnostic ignored "-Wunused-function"
void foo(int i) { }
static void bar() { }
int main() { return 0; }

但是后来,我尝试了这个:

void foo(int i) { }
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
static void bar() { }
#pragma GCC diagnostic pop
int main() { return 0; }

当我编译它时,我得到了原始警告:

pragma.c:4:13: warning: ‘bar’ defined but not used [-Wunused-function]

删除pop摆脱警告:

void foo(int i) { }
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
static void bar() { }
int main() { return 0; }

但我需要一种方法来禁用仅针对特定代码部分的警告。我无法做到这一点。

我很难想象这怎么可能是预期的行为……但是许多其他人已经使用了这个版本的 GCC,如果这是一个错误,它似乎不太可能进入发布版本。

尽管如此,我仍然无法看到这种行为与文档的一致性,该文档说“在一行之后发生的 pragma 不会影响由该行引起的诊断。”

我究竟做错了什么?是否有关于问题的更多信息,例如错误报告和/或有关可能的解决方法的信息?

4

1 回答 1

15

这有效(GCC 版本 4.6.1):

#ifdef __GNUC__
#define SUPPRESS_NOT_USED_WARN __attribute__ ((unused))
#else
#define SUPPRESS_NOT_USED_WARN
#endif

void foo() {  }
SUPPRESS_NOT_USED_WARN static void bar() { }
int main() { return 0; }

/* or
static void SUPPRESS_NOT_USED_WARN bar() { }
 etc. */

/* but not, undefined declarations:
SUPPRESS_NOT_USED_WARN static void bar();
*/

GCC v4.2.4 文档。5.32 指定变量的属性

未使用
        此属性附加到变量,表示该变量可能未使用。GCC 不会对此变量产生警告。

GCC v4.2.4 文档。5.25 声明函数的属性(更正确的链接,函数,对此感到抱歉。)

未使用
        此属性附加到函数,表示该函数可能未使用。GCC 不会对此函数产生警告。


当谈到pragma push,pop等时,文档说:

海湾合作委员会文档。6.57.1​​0 诊断编译指示

修改诊断的处置。请注意,并非所有诊断都是可修改的;目前只能控制警告(通常由'-W...'控制),而不是全部。使用 -fdiagnostics-show-option 确定哪些诊断是可控的,哪些选项控制它们。

它指出; “而不是全部”-Wunused-function似乎是不愿被压制的人之一。该选项fdiagnostics-show-option似乎默认启用。(给出启用错误/警告的标志。)。

使用-Wno-unused-functionat 命令行 禁用它,但当然对于所有人,而不仅仅是代码中直接指定的那些。

如果你说:

gcc -Wunused-function -oo mycode.c

您仍然会收到警告,所以它与编译过程的设置没有任何关系,例如,-Wall在它不起作用的特殊状态下编译过程的设置。


例如,这有效:

int foo(int i) { return i; }

int main() {
    int a;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(a);
#pragma GCC diagnostic pop

    return 0;
}
于 2012-03-23T01:19:43.507 回答