禁止显示编译器警告 声明从未引用的函数



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

void foo (int, int);
void bar ( )
{
    //Do Stuff
   #if (IMPORTANT == 1)
       foo (1, 2);
   #endif
}

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

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

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

[[maybe_unused]] void foo (int, int);

这将禁止显示警告,并且是表达 C++17 中可能未使用的功能的正确惯用方法。

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

-

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

因此,警告应该只针对static功能,很有趣。意义。如果函数static则只能在当前文件中使用,因此其定义也必须在此文件中。

声明它static inline避免警告,而无需诉诸丑陋的宏或特定于编译器的编译指示或属性。

。然后我开始怀疑是否有其他方法可以抑制该功能的警告。

可能有编译器选项来禁止显示此警告。但是,一个技巧是这样的:

(void)foo; //cast it to void.

它应该禁止显示此警告。

您可以编写一个宏:

#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);
}

如您所见,foo的定义本身禁止显示警告。

一种解决方案是通过函数属性。

void foo (int, int) __attribute__ ((unused));

这将告诉 gcc 不要为函数foo发出未使用的功能警告。如果您担心可移植性,可以定义一个宏UNUSED_FUNCTION_ATTRIBUTE,该宏使用支持属性的编译器扩展到__attribute__ ((unused)),但不会扩展到其他任何内容。

封装编译器

和系统依赖内容的一个好方法是将其分解到标头中。然后,您可以根据编译器和系统以及其他内容调整包含路径。您可以对源代码文件执行相同的操作。

在这种情况下,声明似乎不依赖于编译器或系统,因此只需添加以下公共标头:

// [foo.h]
#pragma once
void foo( int, int );

带有实现文件

// [foo.cpp]
#include <foo.virtual.cpp>

然后,对于应该发生某些事情的构建,将包含以下内容的目录添加到包含路径中

// [foo.virtual.cpp]
#include <foo.h>
void foo( int const a, int const b )
{
    // Do the thing.
}

对于不应发生任何事情的构建,请在包含路径中添加一个目录,其中包含

// [foo.virtual.cpp]
#include <foo.h>
void foo( int, int ) {}

如果您担心空函数的调用会非常耗时,例如浪费一纳秒,那么只需将定义移动到标头并添加单词 inline .

如果foo也用于其他目的,请定义一个函数bar,为应该或不应该发生的事情调用它,并为bar而不是foo执行上述操作。

然后,您已经删除了所有预处理器的内容。

请记住,代码中的预处理器指令是不好的。

我找到了一种方法在全球范围内做到这一点,它也适用于c

#define SUPPRESS_UNUSED_WARN(var) 
    int _dummy_tmp_##var = ((int)(var) & 0)

然后你像这样使用它:

static int foo(int a, int b)
{
    // ....
}
SUPRESS_UNUSED_WARN(foo);
  • 它可以用于函数和全局变量
  • 它应该放在全球才能工作
  • 它不能用于局部变量

对于使用 ARM 编译器时的 ARM 目标平台,请在目标函数周围使用以下编译器指令来禁止显示"警告 [Pe177]:已声明但从未引用的函数"警告消息:

#pragma diag_suppress=Pe177
void foo(void)
{
/* does something but is not being called for the current build */
}
#define SUPPRESS_UNUSED_WARN(var) 
    int _dummy_tmp_##var = ((int)(var) & 0)

在 IAR 中不起作用,对此进行更改将起作用:

#define SUPPRESS_UNUSED_WARN(var) 
     void _dummy_tmp_##var(void) { (void)(var); }

您还可以在 Visual Studio 项目设置中定义_CRT_SECURE_NO_DEPRECATE宏。

转到项目属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义

添加_CRT_SECURE_NO_DEPRECATE。

就是这样。!

最新更新