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

2w3rbyxf  于 2023-07-01  发布在  其他
关注(0)|答案(9)|浏览(160)

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

void foo (int, int);

void bar ( )
{
    //Do Stuff

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

}

在没有“IMPORTANT”的情况下进行编译时,我得到一个编译器警告,说明foo已定义且从未引用。这让我思考(这就是问题所在)。
所以为了解决这个问题,我只是在函数定义周围添加了相同的#if (IMPORTANT == 1)等...来删除警告,然后我开始想是否有不同的方法来抑制那个函数上的警告。我正在查看“未使用的”GCC属性,不知道函数是否有相同的属性可以设置?是否还有其他方法来抑制它,只抑制该函数而不是文件的警告?

vc6uscn9

vc6uscn91#

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

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

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

zphenhs4

zphenhs42#

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

-Wunused-function

当声明了静态函数但未定义或未使用非内联静态函数时发出警告。此警告由**-Wall启用。**
所以这个警告应该只针对static函数,很有趣。有道理如果一个函数是static,它只能在当前文件中使用,所以它的定义也必须在这个文件中。
声明它static inline可以避免警告,而不必求助于丑陋的宏或特定于编译器的杂注或属性。

jdg4fx2g

jdg4fx2g3#

...然后我开始想是否有不同的方法来抑制该函数上的警告。
可能有编译器选项来禁止显示此警告。不过,有一个窍门是这样的:

(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的定义本身会抑制警告。

inb24sb2

inb24sb24#

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

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

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

yhived7q

yhived7q5#

封装与编译器和系统相关的内容的一个好方法是将其分解为头文件。然后根据编译器和系统以及其他情况调整包含路径。您可以对源代码文件执行相同的操作。
在这种情况下,声明似乎不依赖于编译器或系统,所以只需添加以下公共头:

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

而对于不应该发生任何事情的构建,则向include路径添加一个包含

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

如果你担心调用一个空函数会非常耗时,比如浪费一纳秒,那么只需将定义移到头文件中,并添加单词inline
如果foo也用于其他目的,则定义一个函数bar,该函数调用它来处理应该或不应该发生的事情,并对bar执行上述操作,而不是对foo执行上述操作。
然后,您已经删除了所有预处理器的东西。
请记住,代码中的预处理器指令是不好的。

zlhcx6iw

zlhcx6iw6#

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

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

然后你使用它像:

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

roejwanj7#

对于ARM目标平台,在使用ARM编译器时,在目标函数周围使用以下编译器指令来抑制“警告[Pe177]:函数已声明但从未引用”警告消息:

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

vm0i2vca8#

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

jgwigjjp9#

还可以在Visual studio项目设置中定义_CRT_SECURE_NO_DEPRECATE宏。
后藤项目属性->配置属性-> C/C++ ->预处理器->预处理器定义
Add _CRT_SECURE_NO_DEPRECATE。
就是这样!

相关问题