2010-07-20 47 views
2

我有一个uint32变量的某些位字段标志状态和这些标志的枚举。这个变量作为参数通过值传递给一些函数。uint64标志或uint32标志[2]为32位编译器的函数参数?

我需要添加大约20个标志。我最好的选择是什么?将它扩展为64位或将其视为2 32位的数组?

扩展到64位将导致我使用编译器'扩展',因为枚举是32位宽。但是使用数组似乎会导致更多的工作。

我的代码在32位和64位编译器上编译,并运行在windows,linux和mac上。

在此先感谢。

+0

64位1位成员的位域结构? – kennytm 2010-07-20 17:37:25

+0

会比编写64个枚举常量更好。 – Puppy 2010-07-20 18:06:40

+0

结构是这样的: 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

回答

3

我会使用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 
} 
0

当你使用C++时,你可以编写一个类作为替换,在内部它可以存储两个32位整数。

2

你了解位域语法?它看起来像这样:

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

+0

http://msdn.microsoft.com/en-us/library/ewwyfdbe(VS10.0).aspx始终使用最新的VS参考。 – Puppy 2010-07-20 18:11:32

+0

这对我来说是404。 – 2010-07-20 18:19:06