2017-08-11 61 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.