所以我有一些像这样的代码:
void foo (int, int);
void bar ( )
{
//Do Stuff
#if (IMPORTANT == 1)
foo (1, 2);
#endif
}
在做没有编译“重要”,我得到一个编译器警告foo是定义并不会被引用。 这让我想(这就是问题所在)。
因此,要解决这个问题,我只是添加了相同#if (IMPORTANT == 1)
周围的功能定义等等去除警告,然后我开始怀疑是否有不同的方式来抑制对功能的警告。 我一直在寻找“未使用” GCC ATTRIB,不知道是否有功能相同的属性我可以设置? 有甚至另一种方式来抑制它抑制该警告仅针对该功能,而不是文件?
...然后我开始怀疑是否有不同的方式来抑制对功能的警告。
有可能是编译器选项(县)禁止这种警告。 然而,一招是这样的:
(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
本身抑制警告。
我相当肯定相关警告选项是这个:
-Wunused功能
每当警告静态函数声明,但没有定义或一个非内联static函数未使用。 这个警告是被-Wall启用。
因此,警告应只给出一个static
函数,有趣。 说得通。 如果一个函数是static
,只能在当前文件内使用,因此其定义也必须在此文件中。
并宣布它static inline
避免了警告,而不是诉诸丑陋宏或特定的编译器的编译或属性。
一种解决方案是通过功能属性。
void foo (int, int) __attribute__ ((unused));
这将告诉GCC不发出的功能未使用的功能警告foo
。 如果你担心的便携性,你可以定义一个宏UNUSED_FUNCTION_ATTRIBUTE
一个可扩展到__attribute__ ((unused))
与支持属性的编译器,而是扩展到任何其他。
在C ++ 17你可以宣布你的函数[[maybe_unused]]
[[maybe_unused]] void foo (int, int);
这将抑制警告,是为了表达一个可能未使用的功能在C ++ 17的正确的,习惯的方法。
封装反编译和系统相关的东西的一个好方法是将其因素伸到头。 然后你调整取决于编译器和系统也许还有其他的东西包括路径。 你可以做的源代码文件相同。
在这种情况下,声明似乎并不依赖于反编译或系统,所以只需添加以下常见的标题:
// [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编译器,使用下面的编译器指令围绕目标函数来抑制这些警告信息:
#pragma diag_suppress 177
void foo(void)
{
/* does something but is not being called for the current build */
}
您还可以在Visual Studio项目设置定义_CRT_SECURE_NO_DEPRECATE宏。
转到项目属性 - >配置属性 - > C / C ++ - >预处理器 - >预处理定义
添加_CRT_SECURE_NO_DEPRECATE。
而已。!