禁止编译器警告函数中声明不会被引用(Suppress Compiler warning Functi

2019-07-30 01:13发布

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

void foo (int, int);

void bar ( )
{
    //Do Stuff

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

}

在做没有编译“重要”,我得到一个编译器警告foo是定义并不会被引用。 这让我想(这就是问题所在)。

因此,要解决这个问题,我只是添加了相同#if (IMPORTANT == 1)周围的功能定义等等去除警告,然后我开始怀疑是否有不同的方式来抑制对功能的警告。 我一直在寻找“未使用” GCC ATTRIB,不知道是否有功能相同的属性我可以设置? 有甚至另一种方式来抑制它抑制该警告仅针对该功能,而不是文件?

Answer 1:

...然后我开始怀疑是否有不同的方式来抑制对功能的警告。

有可能是编译器选项(县)禁止这种警告。 然而,一招是这样的:

(void)foo; //don't call the function, just use it as function-pointer

应该禁止这种警告。

你可以写一个宏:

#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本身抑制警告。



Answer 2:

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

-Wunused功能
每当警告静态函数声明,但没有定义或一个非内联static函数未使用。 这个警告是被-Wall启用

因此,警告应只给出一个static函数,有趣。 说得通。 如果一个函数是static ,只能在当前文件内使用,因此其定义也必须在此文件中。

并宣布它static inline避免了警告,而不是诉诸丑陋宏或特定的编译器的编译或属性。



Answer 3:

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

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

这将告诉GCC不发出的功能未使用的功能警告foo 。 如果你担心的便携性,你可以定义一个宏UNUSED_FUNCTION_ATTRIBUTE一个可扩展到__attribute__ ((unused))与支持属性的编译器,而是扩展到任何其他。



Answer 4:

在C ++ 17你可以宣布你的函数[[maybe_unused]]

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

这将抑制警告,是为了表达一个可能未使用的功能在C ++ 17的正确的,习惯的方法。



Answer 5:

封装反编译和系统相关的东西的一个好方法是将其因素伸到头。 然后你调整取决于编译器和系统也许还有其他的东西包括路径。 你可以做的源代码文件相同。

在这种情况下,声明似乎并不依赖于反编译或系统,所以只需添加以下常见的标题:

// [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

然后,取出所有的预处理器的东西。

请记住, 在代码的预处理命令是解精。



Answer 6:

我找到一个方法来做到这一点全球和它的作品也c

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

然后你使用它,如:

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


Answer 7:

对于ARM目标平台同时使用,ARM编译器,使用下面的编译器指令围绕目标函数来抑制这些警告信息:

#pragma diag_suppress 177
void foo(void)
{
/* does something but is not being called for the current build */
}


Answer 8:

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

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

添加_CRT_SECURE_NO_DEPRECATE。

而已。!



文章来源: Suppress Compiler warning Function declared never referenced