2011-03-07 74 views
1

我正在學習位標誌。我已經知道他們是如何工作的以及他們是如何在struct中定義的。不過,我不確定他們是否能在#define預處理指令定義是這樣的:在C++中使用#define定義位標誌

#define FLAG_FAILED:1 

是這個預處理指令定義了作爲struct位標誌定義是什麼? PS:我已經遇到過這個相關的問題,但它沒有回答我的問題:#defined bitflags and enums - peaceful coexistence in "c"。另外,如果你能指點我一些關於預處理器指令的信息,我將不勝感激。

回答

4

要使用注入bitflags成一個結構必須採取任何形式的#define:

#define IDENTIFIER SUBSTITUTED_CODE 

在你的假設使用...

#define FLAG_FAILED:1 

標識符包含結腸,這使得它無效。

你可以做這樣的事情:

#define FLAG_FAILED int flag_failed :1 

struct X 
{ 
    char a; 
    FLAG_FAILED; 
    int b; 
    ... 
}; 

它爲什麼您使用的是位字段定義反正考慮目前尚不清楚。如果你只是希望能夠改變字段長度,則:

#define FLAG_FAILED_BITS 1 

struct X 
{ 
    unsigned flag_failed :FLAG_FAILED_BITS; 
}; 

......或者......

#define FLAG_FAILED_BITS :1 

struct X 
{ 
    unsigned flag_failed FLAG_FAILED_BITS; 
}; 
+0

簡單的說。爲什麼不能像這樣回答所有問題?謝謝,託尼。 – DeadCapacitor

0

的表格與#define宏定義按位值是:

#define BIT_ONE static_cast<int>(1 << 0) 
#define BIT_TWO static_cast<int>(1 << 1) 
#define BIT_THREE static_cast<int>(1 << 2) 
1

#define FLAG_FAILED:1在大多數人都稱之爲「位標誌」的意義上,它並不是真正的旗幟。這也是不好的語法。

位標誌通常被定義爲您有一個類型,並通過設置它們來打開「on」位。你通過「清除」標誌將它們關閉。爲了比較位標誌是否打開,可以使用所謂的按位運營商AND(例如&)。

所以你BIT0(例如2^0)。將定義BIT0 = 0x00000001和BIT1(例如2^1)BIT1 = 0x00000002。如果你想堅持定義您可以用設置和清除這種方式做到這一點:

#ifndef setBit 
#define setBit(word, mask) word |= mask 
#endif 

#ifndef clrBit 
#define clrBit(word, mask) word &= ~mask 
#endif 

或作爲模板

template<typename T> 
inline T& setBit(T& word, T mask) { return word |= mask; } 

template<typename T> 
inline T& clrBit(T& word, T mask) { return word &= ~mask; } 

如果你想設置該位,可以這麼說,你可以有一個狀態設置如下:

setBit(SystemState, SYSTEM_ONLINE);

setBit(SystemState, <insert type here>SYSTEM_ONLINE);

結算將是相同的只是clrBit取代setBit

比較,只是這樣做:

if (SystemState & SYSTEM_ONLINE) { ... // do some processing 

} 

,如果這是一個struct然後,引用struct