这行代码“#define LIBINJECTION_SQLI_TOKEN_SIZE sizeof(((stoken_t*)(0))->val)”是做什么的?
what does this line of code "#define LIBINJECTION_SQLI_TOKEN_SIZE sizeof(((stoken_t*)(0))->val)" do?
我特别想知道 ->val
在
中做了什么
sizeof(((stoken_t*)(0))->val)
以及 stoken_t*(0)
指针的作用,特别是 (0)
的含义?
我希望我已经足够清楚地阐述了我的问题。
这是一种在编译时访问结构成员的方法,无需定义该结构类型的变量。
将 (stoken_t*)
转换为 0
的值模拟该结构类型的指针,允许您在其上使用 ->
运算符,就像您使用它在该类型的指针变量上。
补充一下,由于 sizeof
是编译时运算符,表达式不会在 run-time 处求值,因此与其他情况不同,这里没有 null-pointer 取消引用发生。
类似于
stoken_t * ptr;
sizeof(ptr->val);
详细:
(stoken_t*)(0)
简单地将 0
(这可以是任意数字文字)转换为指向 stoken_t
的指针,然后 ((stoken_t*)(0)->val)
就是 [=14 的类型=] stoken_t
和 sizeof
的成员 returns 此类型在内存中占用的字节数。简而言之,此表达式在编译时查找结构成员的大小,而不需要该结构类型的实例。
我特别想知道 ->val
在
sizeof(((stoken_t*)(0))->val)
以及 stoken_t*(0)
指针的作用,特别是 (0)
的含义?
我希望我已经足够清楚地阐述了我的问题。
这是一种在编译时访问结构成员的方法,无需定义该结构类型的变量。
将 (stoken_t*)
转换为 0
的值模拟该结构类型的指针,允许您在其上使用 ->
运算符,就像您使用它在该类型的指针变量上。
补充一下,由于 sizeof
是编译时运算符,表达式不会在 run-time 处求值,因此与其他情况不同,这里没有 null-pointer 取消引用发生。
类似于
stoken_t * ptr;
sizeof(ptr->val);
详细:
(stoken_t*)(0)
简单地将 0
(这可以是任意数字文字)转换为指向 stoken_t
的指针,然后 ((stoken_t*)(0)->val)
就是 [=14 的类型=] stoken_t
和 sizeof
的成员 returns 此类型在内存中占用的字节数。简而言之,此表达式在编译时查找结构成员的大小,而不需要该结构类型的实例。