这里发生了什么?
#define CONSTANT_UNICODE_STRING(s) \
{ sizeof( s ) - sizeof( WCHAR ), sizeof(s), s }
.
.
.
.
UNICODE_STRING gInsufficientResourcesUnicode
= CONSTANT_UNICODE_STRING(L"[-= Insufficient Resources =-]");
此代码正常运作。
我需要看看预处理器扩展, 并且在宏观定义中用逗号表示。
答案 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是实际的字符串。逗号只是结构初始化表单的一部分。