我试图理解编译器的警告。我有一节简单的课
#pragma once
#include <framework/project_definitions.hpp>
#include <framework/free_rtos/free_rtos.hpp>
#include <modules/net/imqtt_client.hpp>
#include "mqtt_command_base.hpp"
namespace application::commands
{
class check_alive_command : public mqtt_command_base
{
public:
check_alive_command(
modules::imqtt_client &mqtt_client,
framework::free_rtos::ifree_rtos &free_rtos);
int32_t execute(const uint8_t *payload, uint32_t length) override;
};
}具有以下实现
#include "check_alive_command.hpp"
const static uint8_t _payload_buffer[10] = {};
namespace application::commands
{
check_alive_command::check_alive_command(
modules::imqtt_client &mqtt_client,
framework::free_rtos::ifree_rtos &free_rtos) :
mqtt_command_base(
mqtt_client,
free_rtos,
iobox_check_alive_command,
stack_size_small,
&_payload_buffer[0])
{
}
int32_t check_alive_command::execute(const uint8_t *payload, uint32_t length)
{
return modules::mqtt_error_code::ok;
}
}check_alive_command的基础
#pragma once
#include <modules/net/imqtt_client.hpp>
#include <framework/free_rtos/free_rtos.hpp>
namespace valinso::application::commands
{
class mqtt_command_base
{
public:
mqtt_command_base(
modules::imqtt_client &mqtt_client,
framework::free_rtos::ifree_rtos &free_rtos,
const char * command_name,
const uint32_t stack_size,
uint8_t *payload_buffer);
void run(const uint8_t *payload, uint32_t length);
virtual int32_t execute(const uint8_t *payload, uint32_t length) = 0;
protected:
modules::imqtt_client &_mqtt_client;
framework::free_rtos::ifree_rtos &_free_rtos;
const char * _command_name;
const uint32_t _stack_size;
uint8_t *_payload_buffer;
size_t _current_payload_length = 0;
bool _is_busy = false;
};
}编译器警告
/home/bp/dev/iobox/firmware/app/iobox/commands/check_alive_command.cpp: In constructor 'application::commands::check_alive_command::check_alive_command(modules::imqtt_client&, framework::free_rtos::ifree_rtos&)':
/home/bp/dev/iobox/firmware/app/iobox/commands/check_alive_command.cpp:15:18: warning: '*<unknown>.application::commands::check_alive_command::<anonymous>.application::commands::mqtt_command_base::_payload_buffer' is used uninitialized in this function [-Wuninitialized]
15 | &_payload_buffer[0])为什么?怎么做??甚至都不是真的,对吧?初始化.data部分的启动代码在__libc__init_array之前运行。那么,为什么没有初始化呢?更重要的是,我如何修正这个警告呢?就个人而言,更重要的是:为什么它会发出这样的警告?
发布于 2022-10-16 21:27:38
很简单真的。您有两个名为_payload_buffer的变量。一个是你的静态常数,另一个是mqtt_command_base的成员之一。
当您在check_alive_command的构造函数中引用check_alive_command时,您实际上使用的是成员,而不是静态变量。因此,当然,此时它没有初始化。您的编译器是正确的。
至于修复,要么重命名这两个中的一个,要么告诉编译器您希望全局的一个使用::。
mqtt_command_base(
mqtt_client,
free_rtos,
iobox_check_alive_command,
stack_size_small,
&::_payload_buffer[0]) // <-- :: right there由你决定。
https://stackoverflow.com/questions/74090696
复制相似问题