2010-09-22 20 views
0

這是怎麼回事?#定義參數...爲什麼這個工作?

#define CONSTANT_UNICODE_STRING(s) \ 
        { sizeof(s) - sizeof(WCHAR), sizeof(s), s } 
. 
. 
. 
. 
UNICODE_STRING gInsufficientResourcesUnicode 
      = CONSTANT_UNICODE_STRING(L"[-= Insufficient Resources =-]"); 

此代碼正在工作。

我需要看預處理器擴展, 和什麼在宏定義逗號。

回答

4

UNICODE_STRING<winternl.h>中定義爲具有兩個大小後跟一個指向字符串的指針的類型。

typedef struct _UNICODE_STRING { 
    USHORT Length; 
    USHORT MaximumLength; 
    PWSTR Buffer; 
} UNICODE_STRING; 

宏中的逗號分隔結構中字段的值。

gcc -Wall [your other options go here] -E myfile.c 

在類Unix系統(Linux,OS:

+0

不知道unicode_string是一個結構。感謝所有的答案! – bakra 2010-09-22 21:15:40

4

該宏不能作爲「函數」使用;逗號在那裏,因爲它是一個結構初始化。

假設有一個結構在某個地方被稱爲UNICODE_STRING,其中有三個字段。該宏允許您根據您使用的字符串一次性初始化結構,並適當地填充大小字段。

的最後一條語句是等同於書寫:

UNICODE_STRING gInsufficientResourcesUnicode = { 
    sizeof(L"[-= Insufficient Resources =-]") - sizeof(WCHAR), 
    sizeof(L"[-= Insufficient Resources =-]"), 
    L"[-= Insufficient Resources =-]" 
}; 
0

所有它擴展爲是一個結構初始化。

UNICODE_STRING gInsufficientResourcesUnicode = { sizeof(L"[-= Insufficient Resources =-]") - sizeof (WCHAR), sizeof(L"[-= Insufficient Resources =-]"), L"[-= Insufficient Resources =-]" }; 
0

那麼它擴展爲:

UNICODE_STRING gInsufficientResourcesUnicode = { sizeof(L"[-= Insufficient Resources =-]") - sizeof(WCHAR), 
               sizeof(L"[-= Insufficient Resources =-]"), 
               L"[-= Insufficient Resources =-]" 
               }; 

基本上它的初始化包含3名成員結構。一個是沒有空終止符的常量字符串的長度。下一個是帶有空終止符的字符串的長度,最後是實際的字符串。逗號只是結構初始化形式的一部分。

1

通常你可以通過爲-E選項編譯器,而不是-c選項,以gcc作爲一個例子獲取源文件的預處理程序擴展X)你通常也有一個獨立的預處理器cpp