将 {0x7fc00000} 之类的东西分配给联合意味着什么?

What does assigning something like {0x7fc00000} to a union mean?

我正在将一些代码从 Visual studio 移植到 mingw。解决一些问题后,我遇到了以下问题。我收到错误

 error: no matching function for call to 'DataU::DataU(const char [1])'
 static const DataU NAN  = {0x7fc00000};
                    ^

这是我正在使用的代码

static const DataU NAN  = {0x7fc00000};

这是数据结构

union DataU {
    uint32_t u;
    float f;
};

我对工会没有太多经验,但是我从 here

那里获得了基础知识

我仍然不明白为什么我在 GCC 中的这个声明中出现错误。

 static const DataU NAN  = {0x7fc00000};

据我了解,应该调用 DataU 的复制构造函数。但是,该联合没有自定义复制构造函数。 这是 C++03,我不明白为什么在这里使用 {}。任何有关如何解决此问题的建议都将不胜感激。

更新: 我真的不确定我从哪里得到这个错误。但是我希望这个输出有助于解决这个问题

: error: no matching function for call to 'kt_flash::DataU::DataU(const char [1])'
 static const DataU NAN  = {0x7fc00000};
                    ^
C:\Users\admin\kflash.cpp:55:20: note: candidates are:
C:\Users\admin\kflash.cpp:11:7: note: kt_flash::DataU::DataU()
 union DataU {
       ^
C:\Users\admin\kflash.cpp:11:7: note:   candidate expects 0 arguments, 1 provided
C:\Users\admin\kflash.cpp:11:7: note: constexpr kt_flash::DataU::DataU(const kt_flash::DataU&)
C:\Users\admin\kflash.cpp:11:7: note:   no known conversion for argument 1 from 'const char [1]' to 'const kt_flash::DataU&'
C:\Users\admin\kflash.cpp:11:7: note: constexpr kt_flash::DataU::DataU(kt_flash::DataU&&)
C:\Users\admin\kflash.cpp:11:7: note:   no known conversion for argument 1 from 'const char [1]' to 'kt_flash::DataU&&'
C:\Users\admin\kflash.cpp:55:25: error: expected ',' or ';' before '=' token
 static const DataU NAN  = {0x7fc00000};
                         ^
In file included from C:/mingw64/x86_64-w64-mingw32/include/d3dx9math.h:26:0,
                 from C:/mingw64/x86_64-w64-mingw32/include/d3dx9.h:31,
                 from C:/mingw64/x86_64-w64-mingw32/include/d3dx9math.h:21,
                 from ./ktafx.h:36,
                 from <command-line>:0:
C:\Users\admin\kflash.cpp:59:25: error: no match for call to '(const kt_flash::DataU) (const char [1])'
 const float FLOAT_NAN = NAN.f;
                         ^
Process terminated with status 1 (0 minute(s), 7 second(s))
3 error(s), 3 warning(s) (0 minute(s), 7 second(s))

那是初始化程序,不是赋值。

在初始化程序中,例如:

static const DataU NAN  = {0x7fc00000};

0x7fc00000 初始化 第一个 声明的联合成员——在本例中,u.

C++ 标准 N4296 草案第 8.5.1 [dcl.init.aggr] 节第 16 段中指定:

When a union is initialized with a brace-enclosed initializer, the braces shall only contain an initializer-clause for the first non-static data member of the union.

我希望标准的其他版本中有相同的措辞(C 标准中也有类似的措辞)。

但我认为错误消息的原因是您使用了标识符 NAN。那是在<cmath><math.h>中定义的宏;它扩展为表示浮点 NaN(非数字)的表达式。更改标识符可能会解决问题。 (而且我看到 [AnT 的回答'() 在我之前提到了这一点。)

乍一看,您的代码在语法和语义上都很好。但是,NAN 是在 math.h 中定义的标准 C 宏。这就是它触发奇怪错误的原因。你不应该在你的代码中使用这个名字。

如果 NAN 被其他名称替换,GCC 可以很好地编译代码。但是一旦你调用它 NAN 并包含 cmath(或 math.h),它就会触发错误。在我的实验中,错误信息是不同的。

将名称从 NAN 更改为其他名称。