Eli*_*gan 8 c gcc warnings pragma gcc4
我有一个C程序,其中包含一些尚未使用的静态函数.我想禁用这些特定功能的警告.我不想禁用所有-Wunused-function警告.我正在使用GCC 4.6.特别:
ek@Apok:~/source$ 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.
Run Code Online (Sandbox Code Playgroud)
我遵循文档中的建议(使用push和pop),但我无法使其工作.
我已经创建了一些简化的源代码来调查问题.我正在编译它们gcc -Wall -o pragma pragma.c(在哪里pragma.c).我的第一个版本pragma.c看起来像这样:
void foo(int i) { }
static void bar() { }
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
正如所料,我在编译时得到了这个:
pragma.c:3:13: warning: ‘bar’ defined but not used [-Wunused-function]
Run Code Online (Sandbox Code Playgroud)
也正如预期的那样,我可以像这样禁用警告(然后编译成功静默):
#pragma GCC diagnostic ignored "-Wunused-function"
void foo(int i) { }
static void bar() { }
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
但后来,我尝试了这个:
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; }
Run Code Online (Sandbox Code Playgroud)
当我编译时,我收到了原始警告:
pragma.c:4:13: warning: ‘bar’ defined but not used [-Wunused-function]
Run Code Online (Sandbox Code Playgroud)
删除pop警告:
void foo(int i) { }
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
static void bar() { }
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
但我需要一种方法来禁用仅针对特定代码段的警告.我无法做到这一点.
我很难想象这可能是什么样的行为...但是很多其他人都使用过这个版本的GCC,如果这是一个bug,它似乎不太可能进入发布版本.
尽管如此,我仍然无法看到这种行为与文档是如何一致的,该文档说"在行之后发生的编译指示不会影响由该行引起的诊断".
有谁知道我做错了什么?(或者,如果没有,是否有人有关于该问题的更多信息,例如错误报告的链接和/或有关可能的解决方法的信息.)
Mor*_*pfh 14
这工作(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();
*/
Run Code Online (Sandbox Code Playgroud)
(编辑:)
GCC v4.2.4 doc.5.32指定变量的属性:
unused
此属性附加到变量,表示该变量可能未使用.GCC不会对此变量发出警告.
(Edit.2 :)
GCC v4.2.4 doc.5.25声明函数的属性(更正确的链接,函数,抱歉.)
unused
此属性附加到函数,表示该函数可能未使用.GCC不会对此功能发出警告.
当谈到pragma push和pop等的文件说:
修改诊断的处置.请注意,并非所有诊断都可以修改; 目前只有警告(通常由`-W ......'控制)可以控制,而不是所有警告.使用-fdiagnostics-show-option确定哪些诊断可控,哪个选项控制它们.
它指出; "而不是所有人",-Wunused-function似乎是不愿意被压制的人之一.fdiagnostics-show-option默认情况下,该选项似乎已启用.(给出启用错误/警告的标志.).
-Wno-unused-function在命令行使用禁用它,但当然对所有,而不仅仅是代码中直接指定的那些.
如果你说:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3644 次 |
| 最近记录: |