我有一個uint32變量的某些位字段標誌狀態和這些標誌的枚舉。這個變量作爲參數通過值傳遞給一些函數。uint64標誌或uint32標誌[2]爲32位編譯器的函數參數?
我需要添加大約20個標誌。我最好的選擇是什麼?將它擴展爲64位或將其視爲2 32位的數組?
擴展到64位將導致我使用編譯器'擴展',因爲枚舉是32位寬。但是使用數組似乎會導致更多的工作。
我的代碼在32位和64位編譯器上編譯,並運行在windows,linux和mac上。
在此先感謝。
我有一個uint32變量的某些位字段標誌狀態和這些標誌的枚舉。這個變量作爲參數通過值傳遞給一些函數。uint64標誌或uint32標誌[2]爲32位編譯器的函數參數?
我需要添加大約20個標誌。我最好的選擇是什麼?將它擴展爲64位或將其視爲2 32位的數組?
擴展到64位將導致我使用編譯器'擴展',因爲枚舉是32位寬。但是使用數組似乎會導致更多的工作。
我的代碼在32位和64位編譯器上編譯,並運行在windows,linux和mac上。
在此先感謝。
我會使用STL位集。然後,我的枚舉不一定是2的權力。通過正常的枚舉,它只是進入bitset的索引。您也可以使用vector<bool>
。
主要好處將是可移植性因爲您的標誌集現在適合任何平臺的正常枚舉範圍。
例如:
enum errorFlags { parity, framing, overrun, errorFlags_size };
std::bitset<errorFlags_size> flagSet;
. . .
// either of these set framing error condition
flagSet[framing] = true;
flagset.set(framing);
// either of these clear the framing error condition
flagSet[framing] = false;
flagset.reset(framing);
// this tests for the framing error condition
if (flagSet[framing])
{
// we have a framing error
}
我會建議您使用std::bitset來代替。
當你使用C++時,你可以編寫一個類作爲替換,在內部它可以存儲兩個32位整數。
你瞭解位域語法?它看起來像這樣:
struct Flags {
unsigned int flag1 : 1;
unsigned int flag2 : 1;
unsigned int flag3 : 1;
}
依此類推。冒號後面的數字表示要爲該成員分配的位數。這是標準的C++,而不是一些奇怪的供應商擴展。
更多在http://msdn.microsoft.com/en-us/library/ewwyfdbe(VS.71).aspx。
http://msdn.microsoft.com/en-us/library/ewwyfdbe(VS10.0).aspx始終使用最新的VS參考。 – Puppy 2010-07-20 18:11:32
這對我來說是404。 – 2010-07-20 18:19:06
64位1位成員的位域結構? – kennytm 2010-07-20 17:37:25
會比編寫64個枚舉常量更好。 – Puppy 2010-07-20 18:06:40
結構是這樣的: STATE_1 = 0x1,則 STATE_2 = 0X2, STATE_3 =爲0x4, state_4 = 0x8中, state_5 = 0x10的 等 且標誌可以具有相同的0,1或更多的狀態時間,像state_1 | state3 – WAmadeus 2010-07-20 18:08:51