【问题标题】:Unused variable warning even when explicitly using it inside IF statement即使在 IF 语句中明确使用未使用的变量警告
【发布时间】:2021-03-28 03:33:26
【问题描述】:

我正在尝试创建(使用 C++17)一个简单的调试头,如果启用了标志 LOGGER_DEBUG_MODE,它只会执行一些代码行。这就是我的标题的定义方式(我也尝试使用 { x; } 而不是 x 但警告仍然存在):

debug.h

#ifndef _HDEBUG

    #define _HDEBUG

    static bool LOGGER_DEBUG_MODE = true;
    #define R_DEBUG(x) if(LOGGER_DEBUG_MODE == true) x
    
#endif

我包含了 debug.h 并且在我的代码的某个点我调用宏函数 R_DEBUG 来打印一些值:

logger_adc.cpp

double anlg_device_t::eval_formula()
{
    double result = -9999;

    try
    {
        result = parser.Eval();
    }
    catch (mu::Parser::exception_type &e)
    {
        std::cout << e.GetMsg() << std::endl;
    }

    R_DEBUG(std::cout << "Eval Result: " << result << std::endl);

    return result;
}

我希望一切都能正常运行,但是当我运行 makefile 时,我收到了以下警告:

inc/debug.h:5:14:警告:“LOGGER_DEBUG_MODE”已定义但未使用 [-Wunused-variable] 静态布尔 LOGGER_DEBUG_MODE = true;

我以为我的定义搞砸了,但是在检查了 g++ 创建的临时文件之后,预处理器似乎按照我的预期做了所有事情:

logger_adc.ii

double anlg_device_t::eval_formula()
{
    double result = -9999;

    try
    {
        result = parser.Eval();
    }
    catch (mu::Parser::exception_type &e)
    {
        std::cout << e.GetMsg() << std::endl;
    }

    if(LOGGER_DEBUG_MODE == true) std::cout << "Eval Result: " << result << std::endl;

    return result;
}

为什么即使在 if 语句中明确使用了变量 LOGGER_DEBUG_MODE,我也会收到警告消息?我是否搞砸了一些我没有注意到的明显事情?我的目标文件(出现警告)的编译标志是g++ -Wall -Wextra -O1 -g -std=c++17 -save-temps=obj -Iinc -I/usr/local/include -c 加上pkg-config --cflags --libs libmodbus

如果需要,这是我的 ma​​in 函数:

main.cpp

#include "logger_adc.h"

int main()
{
    anlg_device_t test (ADC_CHIP_1, 1, 18, 1, 1, true);
    test.set_formula("2*x","x", test.get_voltage_ptr());

    std::cout << "Test Voltage: " << test.get_voltage() << std::endl << "Test Relative: " << test.get_relative() << std::endl;

    std::cout << "Test Formula (2*x): " << test.eval_formula() << std::endl;


    return 0;
}

提前致谢!

【问题讨论】:

  • 作为一般提示,与您的问题相关:如果可能,请勿尝试通过静态 (const) 变量构建控制流。如果需要编译时切换(看起来确实是这里的情况),请尽可能仅在此处使用编译时方案(#ifdefs 或 constexpr,自 C++17 起)。
  • #define _HDEBUG 该名称是为语言实现保留的。通过定义它,您的程序将具有未定义的行为。您应该为宏使用另一个名称。
  • @eerorika 改成_HLOGGERDEBUG,谢谢!
  • @LucasVaz 这个名字也是保留的。你应该选择另一个。
  • @eerorika zzzzzz,将其更改为_HDATALOGGERSIGMADEBUG。如果这是保留,我放弃。

标签: c++ gcc g++ c++17


【解决方案1】:

您有一个定义static bool LOGGER_DEBUG_MODE =true; 的标头。如果您在多个 C++ 文件中包含该标头,则 每个文件都将获得该布尔值的自己的副本

在您的 main.cpp 中,您没有使用 R_DEBUG,因此该布尔值的副本(可能来自包含 logger_adc.h )在该文件中确实未使用。

可能的解决方案是:

您应该这样做,这样您就只有该布尔值的一个副本(在标头中用extern 声明它并在单个 C++ 文件中定义它。

使用构建定义而不是运行时检查

【讨论】:

  • 我认为静态变量已经在对象之间共享,这解释了很多。所以它会在标题中变成extern bool LOGGER_DEBUG_MODE;,在主要(例如)中变成bool LOGGER_DEBUG_MODE = true;
  • 静态是 C++ 中的一个重载术语。在一个类中,static 变量确实在该类的所有实例之间共享。作为一个全局变量,static 表示它在 C++ 文件中的本地变量(技术上是翻译单元
  • en.cppreference.com/w/cpp/keyword/static 解释了静态的 3 种不同用途 - 我忘记了函数局部静态 :-)
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 2018-04-15
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2014-07-19
相关资源
最近更新 更多