使用MSVC编译器下的最大成员初始化union

时间:2015-07-26 14:34:30

标签: c++ initialization visual-studio-2015 unions c++03

我正在尝试在C ++库中初始化static LARGE_INTEGER freq = { 0 }; 为0(确切地说是C ++ 03)。以前,初始化是:

static LARGE_INTEGER freq = { .QuadPart = 0 };

在MinGW下,它发出警告:

  

缺少成员'_LARGE_INTEGER :::: HighPart'

的初始化程序

所以我根据Can a union be initialized in the declaration?

将初始化更改为以下内容
81  static LARGE_INTEGER freq = { .QuadPart = 0 };
82  if (freq.QuadPart == 0)
83  {
84      if (!QueryPerformanceFrequency(&freq))
85          throw Exception(Exception::OTHER_ERROR, "Timer: QueryPerformanceFrequency failed ..."));
86 }

hrtimer.cpp(81): error C2059: syntax error: '.'
hrtimer.cpp(81): error C2143: syntax error: missing ';' before '}'
hrtimer.cpp(82): error C2059: syntax error: 'if'
hrtimer.cpp(83): error C2143: syntax error: missing ';' before '{'
hrtimer.cpp(83): error C2447: '{': missing function header (old-style formal list?)
hrtimer.cpp(87): error C2059: syntax error: 'return'

我现在正在Visual Studio 2015下进行测试,并产生错误:

LARGE_INTEGER

如何在MSVC编译器下将联合初始化为其最大成员?

这是微软对#if defined(MIDL_PASS) typedef struct _LARGE_INTEGER { #else // MIDL_PASS typedef union _LARGE_INTEGER { struct { DWORD LowPart; LONG HighPart; } DUMMYSTRUCTNAME; struct { DWORD LowPart; LONG HighPart; } u; #endif //MIDL_PASS LONGLONG QuadPart; } LARGE_INTEGER;

的定义
activity.setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1 个答案:

答案 0 :(得分:3)

{ .QuadPart = 0 };在C ++中是非法的。指定的初始化程序仅限C语言。您链接到问题。

在C ++ 03 [dcl.init.aggr] / 15中:(你的联合是一个聚合):

  

当使用大括号括起初始值设定项初始化union时,大括号只包含union的第一个成员的初始值设定项。

因此,除非该成员是第一个成员,否则无法初始化“最大成员”。

MinGW警告是假的。 g ++用于发出= { 0 };的警告,但这是一个常见的习惯用法,因此他们将其修复为不再执行此操作。我想你的版本有点旧版。

在您的代码中,= { 0 };应将DUMMYSTRUCTNAME初始化为{0, 0}。根据{{​​3}},你的联盟的所有成员都是64位,所以在这种特殊情况下,你确实初始化了最大的成员。