首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在构造函数中使用const静态数组会导致“警告.在此函数中未初始化”

在构造函数中使用const静态数组会导致“警告.在此函数中未初始化”
EN

Stack Overflow用户
提问于 2022-10-16 21:02:54
回答 1查看 24关注 0票数 0

我试图理解编译器的警告。我有一节简单的课

代码语言:javascript
复制
#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;
    };
}

具有以下实现

代码语言:javascript
复制
#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的基础

代码语言:javascript
复制
#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;
    };
}

编译器警告

代码语言:javascript
复制
/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之前运行。那么,为什么没有初始化呢?更重要的是,我如何修正这个警告呢?就个人而言,更重要的是:为什么它会发出这样的警告?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-16 21:27:38

很简单真的。您有两个名为_payload_buffer的变量。一个是你的静态常数,另一个是mqtt_command_base的成员之一。

当您在check_alive_command的构造函数中引用check_alive_command时,您实际上使用的是成员,而不是静态变量。因此,当然,此时它没有初始化。您的编译器是正确的。

至于修复,要么重命名这两个中的一个,要么告诉编译器您希望全局的一个使用::

代码语言:javascript
复制
mqtt_command_base(
            mqtt_client,
            free_rtos,
            iobox_check_alive_command,
            stack_size_small,
            &::_payload_buffer[0]) // <-- :: right there

由你决定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74090696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档