用数组初始化类

时间:2021-05-07 10:01:05

标签: c++ microcontroller

我在这方面发现了很多问题,但似乎没有一个符合我的要求。

目标是初始化一个常量类实例,使其完全放入微控制器的闪存中,不占用任何内存。

这是一个不起作用的例子:

local output=`tail -n "$TAIL_COUNT" "$LOG_FILE" |\ 
tac |\ 
...several other pipe transformations... |\
 grep -Pzo "(?s)(very long pattern1.*){2}very long pattern2"`

使用 g++11 失败并显示消息:

   class Message {

            public:

                    const int _addr;
                    const char _data[ 4 ];

                    Message( int addr, const char data[4] )
                                    : _addr( addr )
                                    , _data( data )
                                    {}
    };

    const Message m[] = { 
            Message( 0x123, { 4, 5, 6, 7 } ),
            Message( 0x234, { 5, 6, 7, 8 } )
    };

使用不同的括号组合失败并出现其他错误...

拥有指向 flash 其他部分的指针将起作用并将所有内容都放在 flash 中,但这不是我想要的。 (它需要额外的空间)

如果我用 C 来做,我会这样做:

    g++     test.cpp   -o test
    test.cpp: In constructor ‘Message::Message(int, const char*)’:
    test.cpp:10:20: error: incompatible types in assignment of ‘const char*’ to ‘const char [4]’

2 个答案:

答案 0 :(得分:2)

here 所述(感谢 taiBsu 在问题评论中发布链接)

<块引用>

您的构造函数参数 [data] 实际上不是数组!是的,我知道它看起来像一个,因为你写了 [char data[4]]。但实际上,它是 [char* data]。

...

因此,错误消息告诉您不能将指针分配给数组。很公平。无论如何都无关紧要,因为该语言也不允许您将数组分配给数组。哈哈。

但是你可以使用 aggregate initialization 来做这样的事情:

struct Message {
    const int _addr;
    const char _data[ 4 ];
};

const Message m[] = { 
    Message{ 0x123, { 4,5,6,7}},
    Message{ 0x234, { 5,6,7,8}}
};

live demo

答案 1 :(得分:0)

这样的事情可以工作:

class Message {

            private:

                    const int _addr;
                    const char * _data;
public:
                    Message( int addr, const char * data )
                            : _addr( addr )
                            , _data( data )
                            {}
    };


    char mm1[] = {4, 5, 6, 7};
    char mm2[] = {5, 6, 7, 8};
    const Message m[] = { 
            Message( 0x123, mm1 ),
            Message( 0x234, mm2 )
    };