我在这方面发现了很多问题,但似乎没有一个符合我的要求。
目标是初始化一个常量类实例,使其完全放入微控制器的闪存中,不占用任何内存。
这是一个不起作用的例子:
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]’
答案 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}}
};
答案 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 )
};