我有以下代码(c ++ 11):
#include <iostream>
using namespace std;
//Icons
typedef struct
{
union
{
struct
{
uint8_t a : 1;
uint8_t b : 1;
uint8_t c : 1;
uint8_t : 5;
};
uint8_t Data;
} Bla;
union
{
struct
{
uint8_t d : 1;
uint8_t e : 1;
uint8_t : 6;
};
uint8_t Data;
} Foo;
union
{
struct
{
uint8_t f : 1;
uint8_t g : 1;
uint8_t h : 1;
uint8_t i : 1;
uint8_t : 4;
};
uint8_t Data;
} Bar;
}TypeStruct;
int main()
{
static constexpr TypeStruct NONE = {0x00,0,0};
static constexpr TypeStruct A = {0x01,0,0};
static constexpr TypeStruct B = {0x02,0,0};
static constexpr TypeStruct C = {0x04,0,0};
return 0;
}
使用IAR进行编译并可以正常工作,但是使用GCC进行学问时,出现了以下错误,这使我困扰了几天。
$g++ -std=c++11 -o main *.cpp
main.cpp: In function ‘int main()’:
main.cpp:50:52: warning: large integer implicitly truncated to unsigned type [-Woverflow]
static constexpr TypeStruct B = {0x02,0,0};
^
main.cpp:51:52: warning: large integer implicitly truncated to unsigned type [-Woverflow]
static constexpr TypeStruct C = {0x04,0,0};
^
我不明白为什么!
也许与工会有关,但我尝试了不同的著作,但没有匹配:
{1,0,0}或{{1},{0},{0}}或{{1,0,0}}
问题是我需要在专业化中使用“ A”之类的东西,并且不能更改,可以这样说:
MyClass:MyMotherClass(TypeStruct A);
谢谢
编辑:
选择的解决方案使用的是:
static constexpr TypeStruct A = {{1,0,0},{0,0},{0,0,0,0}};
static constexpr TypeStruct B = {{0,1,0},{0,0},{0,0,0,0}};
static constexpr TypeStruct C = {{0,0,1},{0,0},{0,0,0,0}};
etc...
但是,通过使用IAR和GCC进行编译的解决方案,我得到以下PC皮棉消息,优先级:高,类别:4397。
"pc lint constexpr variable 'A' must be initialized by a constant expression"
"pc lint constexpr variable 'B' must be initialized by a constant expression"
"pc lint constexpr variable 'C' must be initialized by a constant expression"
最佳答案
初始化被应用到位域结构,因为它是在联合中首先声明的。 (先放置uint8_t数据成员,然后看警告消失)。结果,第一个成员的0x02和0x04太大(uint8_t a)。
您可以通过明确指定位字段初始化来解决此问题,例如
static constexpr TypeStruct B = {{0,1},0,0};
static constexpr TypeStruct C = {{0,0,1},0,0};
注意,通常,不能保证位域将与字节(或其他整数类型)中的位位置相对应-由编译器决定。因此,直接用字节值(如0x02和0x04)初始化位域结构是一个糟糕的主意。