#define with parameters ...为什么这有用?

时间:2010-09-22 21:01:20

标签: c macros c-preprocessor

这里发生了什么?

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

此代码正常运作。

我需要看看预处理器扩展, 并且在宏观定义中用逗号表示。

5 个答案:

答案 0 :(得分:4)

宏不起“功能”的作用;逗号是因为它是结构初始化。

据推测,有一个名为UNICODE_STRING的结构,其中定义了三个字段。宏允许您根据您正在使用的字符串一次性初始化结构,并适当地填充大小字段。

最后一句话相当于写作:

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

答案 1 :(得分:4)

UNICODE_STRING<winternl.h>中定义为具有两个大小的类型,后跟指向字符串的指针。

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

宏中的逗号分隔结构中字段的值。

答案 2 :(得分:1)

通常,您可以通过向编译器而不是-E选项提供-c选项来获取源文件的预处理器扩展,并以gcc为例:

gcc -Wall [your other options go here] -E myfile.c
在类似unix的系统(linux,OS X)上,你经常有一个名为cpp的独立预处理器。

答案 3 :(得分:0)

它扩展为结构化初始化器。

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

答案 4 :(得分:0)

它扩展到:

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

基本上它初始化一个包含3个成员的结构。一个是没有null终止符的常量字符串的长度。接下来是带有null终止符的字符串的长度,final是实际的字符串。逗号只是结构初始化表单的一部分。