Loading... > 编译器1:msvc 2017 > > 编译器2:arm-linux-gnueabihf-g++ > > QT版本:5.12.10 # 坑一 有等号初始化,不是聚合类 有如下结构体定义 ```c++ #pragma once #include <QtCore> struct DataNode { QString addr; quint32 nodeIndex; QVariant nodeValue; uint64_t updateTime=0; uint64_t lastSendTime=0; bool operator ==(const DataNode& n)const { return (devAddr == n.devAddr && nodeIndex == n.nodeIndex); } }; inline uint qHash(const DataNode key) { return qHash(key.devAddr +QString::number(key.nodeIndex)); } ``` 和变量`QSet<DataNode> m_DataSet`定义。 以及基于`QSet`的节点查找: ```c++ auto p = m_DataSet.find({ addr,dataIndex }); if (p == m_DataSet.end()) { //do something while not exist! } else { //do something while found need! } ``` 上述`m_DataSet.find({ addr,dataIndex })`在**Visual Studio Community 2019(with Qt VS Tools)**下,完美满足预期效果:通过列表`{ addr,dataIndex }`初始化构造DataNode,并进行find操作。 但是在交叉编译环境下,`DataNode` **有等号初始化,不是聚合类,无法进行列表初始化**,从而报错。 将等号初始化代码去掉,问题解决。 # 坑二 char[]初始化 有如下类定义: ```c++ //A.hpp class A { public: A(){}; ~A(){}; /*其他细节忽略*/ private: uint8_t address[160]="\0"; } ``` 上述代码在在**Visual Studio Community 2019(with Qt VS Tools)**下同样没问题,但是在交叉编译环境下,提示*error: char-array initialized from wide string*!!!! 然后将`uint8_t address[160]="\0"`改为`uint8_t address[160]={0}`解决问题。 # 总结 还是得谨慎对待变量的初始化。 但是上述问题,到底是各编译器实现细节差异还是啥原因导致的,尚不明了。 最后修改:2021 年 09 月 08 日 03 : 29 PM © 允许规范转载