这行代码“#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_tsizeof 的成员 returns 此类型在内存中占用的字节数。简而言之,此表达式在编译时查找结构成员的大小,而不需要该结构类型的实例。