2017-08-11 63 views
2

我想在C++中增加LARGE_INTEGER但我得到以下错误。如何增加LARGE_INTEGER

错误C2397:从“LONGLONG”到“DWORD”转换需要一个收缩转换

我不知道我做错了。其非常简单的问题,我试图重建项目,但错误不会消失。

std::atomic<LARGE_INTEGER> value; // this field is defined in header 

这些行都是我试过的,都给出了同样的错误。

// inside a method in cpp 
value = {get_some_large_integer().QuadPart + 1}; 

value = LARGE_INTEGER{get_some_large_integer().QuadPart + 1}; 

value = static_cast<LARGE_INTEGER>(LARGE_INTEGER{get_some_large_integer().QuadPart + 1}); 
+0

是的,我必须使用'LARGE_INTEGER',因为我仅限于使用此数据类型的库窗口函数。是的,'value = {get_some_large_integer()};'也适用于我,但是'value = {get_some_large_integer()。QuadPart};'给出错误。看起来增量不是问题,但访问QuadPart是一个如何的问题。 @CodyGray –

+0

@CodyGray我看到了,但它的怪异ctor不接受64位值。它的奇怪,如果它的64位值应该有! –

+1

它正在从'li.QuadPart'中初始化'LARGE_INTEGER',这是问题所在。尝试不用'std :: atomic'。你会遇到同样的问题。没有办法直接从64位值构造'LARGE_INTEGER'(因为不幸的是,C++没有[指定初始化函数](https://stackoverflow.com/questions/31638182/initialize-union-using-largest -member-下MSVC编译器))。您需要使用两个32位的一半来构建它。我不知道这里有一个好的解决方案。也许别人会。 –

回答

1

您可以直接使用Quadpart。请注意,它是一个64位长整数。也称为long long和__int64,由MS编译器和gcc编译。由于它是一种普通的旧数据类型,编译器支持所有的算术运算和按位操作。

LARGE INTEGER

typedef union _LARGE_INTEGER { 
    struct { 
    DWORD LowPart; 
    LONG HighPart; 
    }; 
    struct { 
    DWORD LowPart; 
    LONG HighPart; 
    } u; 
    LONGLONG QuadPart;  // <-- this is a 64 bit integer. 
} LARGE_INTEGER, *PLARGE_INTEGER; 

LARGE_INTEGER的定义是一个普通的C结合,并因此不提供任何构造。但是,您可以使用C聚合初始化程序将其初始化为零。

LARGE_INTEGER li = {}; // initialize to zero. 

使用QuadPart,你可以操纵LARGE_INTEGER,你会任何长长整型...

递增:

li.QuadPart++; 

补充说:

__int128 i = 123456LL; 
li.QuadPart += i; 

等。 。

li.QuadPart = 123456LL * 5; 

重要提示:MS使用LARGE_INTEGER联合来传递如此长的值,既出于历史原因,也用于强制long long的对齐。如果Quadpart未正确对齐,某些Windows API将崩溃。所以在调用Windows API时简单地将__int64 *强制转换为LARGE_INTEGER *并不是一个好习惯。

在64位窗口中,64位增量,即li.Quadpart ++是一个原子操作。

+0

当然,你可以这样做,但是你抛弃了问题的'std :: atomic'部分。 –

1

由于@CodyGray在评论中提到的问题,我想出了这个解决方案。该操作仍然是原子的,因为atomic_store只关心,变量xy是线程和方法的局部变量。

LARGE_INTEGER x = get_some_large_integer(); 
LONGLONG y = x.QuadPart + 1; // increment 
x.LowPart = (LONG)y; 
x.HighPart = (LONG)(y >> 32); 
value = x; // atomic operation.