C++ 未使用变量警告,即使在IF语句中显式使用它
我试图创建(使用C++17)一个简单的调试头,如果启用了标记LOGGER\u debug\u MODE,它只执行一些代码行。这就是我的头的定义方式(我也尝试使用{x;}而不是x,但警告仍然存在): 调试.h 我包含了debug.h,在代码的某个地方,我调用宏函数R\u debug来打印一些值: 记录器adc.cppC++ 未使用变量警告,即使在IF语句中显式使用它,c++,gcc,g++,c++17,C++,Gcc,G++,C++17,我试图创建(使用C++17)一个简单的调试头,如果启用了标记LOGGER\u debug\u MODE,它只执行一些代码行。这就是我的头的定义方式(我也尝试使用{x;}而不是x,但警告仍然存在): 调试.h 我包含了debug.h,在代码的某个地方,我调用宏函数R\u debug来打印一些值: 记录器adc.cpp 提前谢谢 您有一个定义静态bool LOGGER\u DEBUG\u MODE=true的头。如果将该头包含在多个C++文件中,那么每个文件将得到它自己的Boo../P>的副本。 在
提前谢谢 您有一个定义
静态bool LOGGER\u DEBUG\u MODE=true的头代码>。如果将该头包含在多个C++文件中,那么每个文件将得到它自己的Boo../P>的副本。
在main.cpp中,您没有使用R\u DEBUG
,因此该bool的副本(可能来自includelogger\u adc.h
)确实未在该文件中使用
可能的解决办法是:
你应该这样做,所以你只有一个BoL拷贝(在代码中用“代码>外部代码< /代码>声明它”,并在一个C++文件中定义它。
使用生成定义而不是运行时检查
etc作为一个与您的问题相关的一般提示:如果可能,不要尝试通过静态(const)变量构建控制流。如果需要编译时切换(这里看起来是实际情况),如果可能,只在这里使用编译时方案(从C++17开始使用ifdefs或constexpr).\define\u HDEBUG
该名称是为语言实现保留的。通过定义,您的程序将具有未定义的行为。您应该为宏使用另一个名称。@eerorika将其更改为\u HLOGGERDEBUG
,谢谢!@LucasVaz该名称也是保留的。您应该选择另一个名称。@eerorika zzzzz,将其更改为_HDATALOGGERSIGMADEBUG
。如果这是保留的,我就放弃了。我认为静态变量已经在对象之间共享了,这解释了很多。因此它将成为类似于头中的extern bool LOGGER\u DEBUG\u MODE;
和主中的bool LOGGER\u DEBUG\u MODE=true;
(例如)静态是C++中的一个重载项。在类中,在该类的所有实例之间确实共享了<代码>静态< /COD>变量。作为一个全局变量,<代码> static < /C> >它的本地到C++文件(技术翻译单元)解释静态的3种不同用途:“我忘记函数局部静力学:-”
#ifndef _HDEBUG
#define _HDEBUG
static bool LOGGER_DEBUG_MODE = true;
#define R_DEBUG(x) if(LOGGER_DEBUG_MODE == true) x
#endif
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;
}
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;
}
#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;
}