所以我有一些这样的代码:
void foo (int, int);
void bar ( )
{
//Do Stuff
#if (IMPORTANT == 1)
foo (1, 2);
#endif
}
在没有“IMPORTANT”的情况下进行编译时,我得到一个编译器警告,说明foo已定义且从未引用。这让我思考(这就是问题所在)。
所以为了解决这个问题,我只是在函数定义周围添加了相同的#if (IMPORTANT == 1)
等...来删除警告,然后我开始想是否有不同的方法来抑制那个函数上的警告。我正在查看“未使用的”GCC属性,不知道函数是否有相同的属性可以设置?是否还有其他方法来抑制它,只抑制该函数而不是文件的警告?
9条答案
按热度按时间vc6uscn91#
在C++17中,你可以用
[[maybe_unused]]
声明你的函数:这将抑制警告,并且是在C++17中表达可能未使用的函数的正确、惯用的方式。
zphenhs42#
我很确定相关的警告选项是这样的:
-Wunused-function
当声明了静态函数但未定义或未使用非内联静态函数时发出警告。此警告由**-Wall启用。**
所以这个警告应该只针对
static
函数,很有趣。有道理如果一个函数是static
,它只能在当前文件中使用,所以它的定义也必须在这个文件中。声明它
static inline
可以避免警告,而不必求助于丑陋的宏或特定于编译器的杂注或属性。jdg4fx2g3#
...然后我开始想是否有不同的方法来抑制该函数上的警告。
可能有编译器选项来禁止显示此警告。不过,有一个窍门是这样的:
它应该抑制此警告。
你可以写一个宏:
正如您所看到的,
foo
的定义本身会抑制警告。inb24sb24#
一种解决方案是通过函数属性。
这将告诉gcc不要为函数
foo
发出未使用的函数警告。如果您担心可移植性,可以定义一个宏UNUSED_FUNCTION_ATTRIBUTE
,它使用支持属性的编译器扩展为__attribute__ ((unused))
,但不扩展为其他任何内容。yhived7q5#
封装与编译器和系统相关的内容的一个好方法是将其分解为头文件。然后根据编译器和系统以及其他情况调整包含路径。您可以对源代码文件执行相同的操作。
在这种情况下,声明似乎不依赖于编译器或系统,所以只需添加以下公共头:
带有实现文件
然后,对于应该发生某些事情的构建,将包含以下内容的目录添加到包含路径
而对于不应该发生任何事情的构建,则向include路径添加一个包含
如果你担心调用一个空函数会非常耗时,比如浪费一纳秒,那么只需将定义移到头文件中,并添加单词
inline
。如果
foo
也用于其他目的,则定义一个函数bar
,该函数调用它来处理应该或不应该发生的事情,并对bar
执行上述操作,而不是对foo
执行上述操作。然后,您已经删除了所有预处理器的东西。
请记住,代码中的预处理器指令是不好的。
zlhcx6iw6#
我找到了一种在全球范围内实现这一点的方法,它也适用于
c
然后你使用它像:
roejwanj7#
对于ARM目标平台,在使用ARM编译器时,在目标函数周围使用以下编译器指令来抑制“警告[Pe177]:函数已声明但从未引用”警告消息:
vm0i2vca8#
在IAR中不起作用,更改为以下内容将起作用:
jgwigjjp9#
还可以在Visual studio项目设置中定义_CRT_SECURE_NO_DEPRECATE宏。
后藤项目属性->配置属性-> C/C++ ->预处理器->预处理器定义
Add _CRT_SECURE_NO_DEPRECATE。
就是这样!