抑制编译器警告声明从未引用的函数

Jte*_*llo 17 c c++ gcc gcc-warning

所以我有一些像这样的代码:

void foo (int, int);

void bar ( )
{
    //Do Stuff

   #if (IMPORTANT == 1)
       foo (1, 2);
   #endif

}
Run Code Online (Sandbox Code Playgroud)

在没有"重要"的情况下进行编译时,我得到一个编译器警告foo已定义且从未被引用.这让我思考(这就是问题).

所以为了解决这个问题,我只是#if (IMPORTANT == 1)在功能定义等地方添加了相同内容...以删除警告,然后我开始怀疑是否有不同的方法来抑制该功能的警告.我正在查看"未使用的"GCC attrib并且不知道函数是否具有我可以设置的相同属性?是否还有另一种方法可以抑制它只抑制那个函数而不是文件的警告?

Jon*_*ely 26

我很确定相关的警告选项是这个:

-Wunused-function
每当声明静态函数但未定义静态函数或未使用非内联静态函数时发出警告.-Wall启用此警告.

所以警告只应该给一个static有趣的功能.说得通.如果函数是static它只能在当前文件中使用,那么它的定义也必须在此文件中.

并且声明它static inline可以避免警告,而不需要使用丑陋的宏或特定于编译器的pragma或属性.

  • `static inline`不会(总是)为clang压制这个. (4认同)
  • 恕我直言,这应该是公认的答案,因为用户询问“是否有另一种方法来抑制它,仅抑制该函数而不是文件的警告?” 声明函数“static inline”确实“避免了警告[仅针对该函数],而无需诉诸丑陋的宏或特定于编译器的编译指示或属性”。如果您必须在 C++ 文件中包含此类函数而不使用它们,请使用“inline”标签。 (2认同)

Naw*_*waz 25

...然后我开始怀疑是否有一种不同的方法来抑制该功能的警告.

可能存在编译器选项来抑制此警告.但是,一个技巧是:

(void)foo; //cast it to void.
Run Code Online (Sandbox Code Playgroud)

它应该压制这个警告.

你可以写一个宏:

#define SUPPRESS_WARNING(a) (void)a

void foo(int thisIsAlsoAnUnsedParameter, int usedParameter)
{
   SUPPRESS_WARNING(foo); //better do this inside the definition itself :D

   SUPPRESS_WARNING(thisIsAlsoAnUnsedParameter);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,foo自身的定义会抑制警告.

  • 此外,至少使用Clang 3.4,这似乎用新的"不需要功能且不会发出"警告替换未使用的功能警告:) (3认同)

Dav*_*men 20

一种解决方案是通过功能属性.

void foo (int, int) __attribute__ ((unused));
Run Code Online (Sandbox Code Playgroud)

这将告诉gcc不要为该函数发出未使用的函数警告foo.如果您担心可移植性,可以定义一个UNUSED_FUNCTION_ATTRIBUTE扩展为__attribute__ ((unused))支持属性的编译器的宏,否则扩展为空.

  • 你不需要`UNUSED_FUNCTION_ATTRIBUTE`。您可以在不支持 gnu 属性的编译器上定义`#define __attribute__(x)` 使它们消失。它的优点是它取消了所有属性(pure、const、malloc、printf 等),并且您不需要针对所有不同变体的几个 ad-hoc 宏。那是 `__attribute__` gnu 扩展的奇怪双括号语法的最初基本原理,因此即使没有 `VARARGS` 的古老预处理器也可以中和它们。 (2认同)

Tar*_*ama 20

在C++ 17中,您可以使用以下命令声明您的函数[[maybe_unused]]:

[[maybe_unused]] void foo (int, int);
Run Code Online (Sandbox Code Playgroud)

这将抑制警告,并且是在C++ 17中表达可能未使用的函数的正确的惯用方法.