C 警告:变量已设置但未使用[-Wunused但已设置变量]

C 警告:变量已设置但未使用[-Wunused但已设置变量],c,gcc,gcc-warning,C,Gcc,Gcc Warning,在编译GCC4.6.1中的C源代码时,我收到了以下警告 warning: variable set but not used [-Wunused-but-set-variable] 我参考了这个链接,但可以得到这个警告的确切原因。有谁能告诉我更多的细节是什么导致了这个警告,我们如何才能摆脱它 [编辑] 我有一段代码。编译显示上述警告。你能告诉我怎么改正吗 test_function(){ BOOL BoolTest; BoolTest = test_fucntion2(

在编译GCC4.6.1中的C源代码时,我收到了以下警告

   warning: variable set but not used [-Wunused-but-set-variable]
我参考了这个链接,但可以得到这个警告的确切原因。有谁能告诉我更多的细节是什么导致了这个警告,我们如何才能摆脱它

[编辑] 我有一段代码。编译显示上述警告。你能告诉我怎么改正吗

   test_function(){
   BOOL BoolTest;
   BoolTest = test_fucntion2();

   #ifdef CHECK
   if (!BoolTest) {
   misc_StartErrorReport();
   misc_ErrorReport("\n test_function2: Input not indexed.\n");
   misc_FinishErrorReport();
          }
   #endif
   // 
    BoolTest is no more used below it.
   // } 

设置变量就是给它赋值(可能是隐式的)

在上面的程序中,两个变量都设置为一个值,但没有使用。 如果我将第二行替换为

    int local2 = local1;
现在我已经使用了
local1
变量——警告应该只有1


要消除警告,请从代码中删除分配。这反过来可能会产生其他警告…:)

这意味着您将一个值赋给一个变量,但以后在代码中永远不会读取该值(因此使用了“设置但未使用”)。例如:

int useful = 10;
int useless = 3;
if (useful) {
    //Do stuff
}
请注意,您同时给出了
有用的
无用的
值,但您只读取
有用的
中的值。
通常,当我收到此消息时,这意味着我忘记了某个变量,或者找到了一种方法来内联不再需要该变量的语句。

您需要在
BoolTest的声明和初始化周围包含预处理器保护:

test_function()
{
#ifdef CHECK
    BOOL BoolTest = test_function2();
#else
    test_function2();
#endif


#ifdef CHECK
    if (!BoolTest) {
        misc_StartErrorReport();
        misc_ErrorReport("\n test_function2: Input not indexed.\n");
        misc_FinishErrorReport();
    }
#endif

(这假设您仍然希望调用
test\u function2()
,即使没有定义
CHECK
,可能是因为它的副作用-如果没有,那么您就不需要
#else
部分,您可以将两个
#ifdef
块组合成一个块)。

您没有使用BoolTest。您可以看到您的代码和

test_function(){
#ifdef CHECK
if (!test_fucntion2()) {

使用g++7.x及更高版本和clang++4.x及更高版本(使用c++11或更高版本), 与Visual Studio 2017 15.3版及更高版本(可与/std:c++17一起使用)一样,您也可以使用标准化的[[maybe_unused]]属性

比如说,

int main()
{
    int x [[maybe_unused]] = 5;
}
不会给出警告,即使使用-Wunused变量等也不会

int main()
{
    int x [[maybe_unused]] = 5;
}