我正在尝试在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);
答案 0 :(得分:3)
{ .QuadPart = 0 };
在C ++中是非法的。指定的初始化程序仅限C语言。您链接到c问题。
在C ++ 03 [dcl.init.aggr] / 15中:(你的联合是一个聚合):
当使用大括号括起初始值设定项初始化union时,大括号只包含union的第一个成员的初始值设定项。
因此,除非该成员是第一个成员,否则无法初始化“最大成员”。
MinGW警告是假的。 g ++用于发出= { 0 };
的警告,但这是一个常见的习惯用法,因此他们将其修复为不再执行此操作。我想你的版本有点旧版。
在您的代码中,= { 0 };
应将DUMMYSTRUCTNAME
初始化为{0, 0}
。根据{{3}},你的联盟的所有成员都是64位,所以在这种特殊情况下,你确实初始化了最大的成员。