2011-04-06 227 views
2

雖然通過我碰到下面的結構傳來DirectWrite的源代碼閱讀:結構成員初始化

/// <summary> 
/// Line breakpoint characteristics of a character. 
/// </summary> 
struct DWRITE_LINE_BREAKPOINT 
{ 
    /// <summary> 
    /// Breaking condition before the character. 
    /// </summary> 
    UINT8 breakConditionBefore : 2; 

    /// <summary> 
    /// Breaking condition after the character. 
    /// </summary> 
    UINT8 breakConditionAfter : 2; 

    /// <summary> 
    /// The character is some form of whitespace, which may be meaningful 
    /// for justification. 
    /// </summary> 
    UINT8 isWhitespace   : 1; 

    /// <summary> 
    /// The character is a soft hyphen, often used to indicate hyphenation 
    /// points inside words. 
    /// </summary> 
    UINT8 isSoftHyphen   : 1; 

    UINT8 padding    : 2; 
}; 

通知怪「:」每一個成員的聲明之後。我將假設它是成員變量的默認初始化值。

我試着搜索谷歌來確認,但並不知道它的名字到底是什麼,我沒有得到太多的結果(大部分結果在默認初始化的情況下)。

這種技術的名稱是什麼?

+0

他們只是「奇怪」,因爲你不知道他們是什麼。 :) – 2011-04-06 09:39:44

回答

4

注意每個 成員聲明後的奇怪「:」。我打算 假定它是成員變量的默認初始值 值。

這不是默認初始化。這意味着breakConditionBefore只是2位整數,isWhitespace是一個1位整數。等等。

DWRITE_LINE_BREAKPOINT中,一個8位整數(即UINT8)被分成5個成員,其中3個是2位整數,2個成員是1位整數。

閱讀Bit-fields

2

:2聲明2位的成員。這被稱爲位域。由於聲明的總位數總和爲8,因此所有位域成員都是相鄰的,它們的類型是UINT8struct DWRITE_LINE_BREAKPOINT是單字節大小。

1

那麼,他們是位域。

標準文檔本身就是一個例子。

1.7.5的C++存儲器模型

[實施例:一個結構聲明爲

struct { 
char a; 
int b:5, 
c:11, 
:0, 
d:8; 
struct {int ee:8;} e;` 
} 

包含四個單獨的存儲器位置處:該字段a和位域de.ee是每個單獨的存儲位置,並且可以被同時修改而不會相互干擾。位字段bc一起構成第四存儲單元的 。比特字段bc不能同時修改,但例如ba可以是。 -End example]