所以我有一些像这样的代码:
void foo (int, int);
void bar ( )
{
//Do Stuff
#if (IMPORTANT == 1)
foo (1, 2);
#endif
}
在没有“重要”的情况下进行编译时,我得到一个编译器警告foo已定义且从未被引用。这让我思考(这就是问题)。
所以为了解决这个问题,我只是在函数定义等处添加了相同的#if (IMPORTANT == 1)
...以删除警告,然后我开始怀疑是否有不同的方法来抑制该函数的警告。我正在查看“未使用的”GCC attrib并且不知道函数是否具有我可以设置的相同属性?是否还有另一种方法可以抑制它仅抑制该功能而不是文件的警告?
答案 0 :(得分:23)
我很确定相关的警告选项就是这个:
-Wunused-function
启用
每当声明静态函数但未定义静态函数或未使用非内联静态函数时发出警告。此警告由 -Wall。
所以警告只应该给static
函数,有趣的。说得通。如果函数是static
,它只能在当前文件中使用,因此它的定义也必须在此文件中。
声明它static inline
可以避免警告,而不需要使用丑陋的宏或编译器特定的编译指示或属性。
答案 1 :(得分:19)
...然后我开始怀疑是否有一种不同的方法来抑制该功能的警告。
可能有编译器选项来抑制此警告。然而,一个诀窍就是:
(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
本身的定义会抑制警告。
答案 2 :(得分:18)
一种解决方案是通过功能属性。
void foo (int, int) __attribute__ ((unused));
这将告诉gcc不要为函数foo
发出未使用的函数警告。如果您担心可移植性,可以使用支持属性的编译器定义扩展为UNUSED_FUNCTION_ATTRIBUTE
的宏__attribute__ ((unused))
,否则扩展为空。
答案 3 :(得分:17)
在C ++ 17中,您可以使用[[maybe_unused]]
声明您的函数:
[[maybe_unused]] void foo (int, int);
这将抑制警告,并且是在C ++ 17中表达可能未使用的函数的正确的惯用方法。
答案 4 :(得分:2)
封装编译器和系统相关内容的好方法是将其分解为标头。然后根据编译器和系统以及其他内容调整包含路径。您可以对源代码文件执行相同的操作。
在这种情况下,声明似乎不依赖于编译器或系统,因此只需添加以下公共头:
// [foo.h]
#pragma once
void foo( int, int );
使用实施文件
// [foo.cpp]
#include <foo.virtual.cpp>
然后,对于应该发生某事的构建,将include路径添加到包含
的目录中// [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
。
然后,您已删除所有预处理器内容。
请记住,代码中的预处理程序指令是不合适的。
答案 5 :(得分:1)
我找到了一种全球范围内的方法,它也适用于c
#define SUPPRESS_UNUSED_WARN(var) \
int _dummy_tmp_##var = ((int)(var) & 0)
然后你就像使用它一样:
static int foo(int a, int b)
{
// ....
}
SUPRESS_UNUSED_WARN(foo);
答案 6 :(得分:0)
对于使用ARM目标平台的ARM编译器,在目标函数周围使用以下编译器指令来抑制那些警告消息:
#pragma diag_suppress 177
void foo(void)
{
/* does something but is not being called for the current build */
}
答案 7 :(得分:0)
#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); }
答案 8 :(得分:-4)
您还可以在Visual Studio项目设置中定义_CRT_SECURE_NO_DEPRECATE宏。
转到项目属性 - &gt;配置属性 - &gt; C / C ++ - &gt;预处理器 - &gt;预处理器定义
添加_CRT_SECURE_NO_DEPRECATE。
多数民众赞成。!