所以我有一些这样的代码:
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。
就是这样。!