我遇到了这个编译好的奇怪的代码片段:
class Car
{
public:
int speed;
};
int main()
{
int Car::*pSpeed = &Car::speed;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么 C++有一个指向类的非静态数据成员的指针?在实际代码中这个奇怪的指针有什么用?
在ANSI C中,offsetof定义如下.
#define offsetof(st, m) \
((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
Run Code Online (Sandbox Code Playgroud)
为什么这不会引发分段错误,因为我们正在取消引用NULL指针?或者这是某种编译器黑客,它看到只有偏移的地址被取出,所以它静态地计算地址而不实际解除引用它?这个代码也可以移植吗?
((struct name*)0) - > member)在C中做什么?
我遇到的实际C语句是这样的:
(char *) &((struct name *)0)->member)
Run Code Online (Sandbox Code Playgroud) 我想要offsetof()参数行mystruct1.我试过了
offsetof(struct mystruct1, rec.structPtr1.u_line.line)
Run Code Online (Sandbox Code Playgroud)
并且
offsetof(struct mystruct1, line)
Run Code Online (Sandbox Code Playgroud)
但都不起作用.
union {
struct mystruct1 structPtr1;
struct mystruct2 structPtr2;
} rec;
typedef struct mystruct1 {
union {
struct {
short len;
char buf[2];
} line;
struct {
short len;
} logo;
} u_line;
};
Run Code Online (Sandbox Code Playgroud) 我一直在寻找很长很长的时间(最后的链接)来解释 offsetof MACRO 的实现:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
Run Code Online (Sandbox Code Playgroud)
特别是,取消引用 NULL 以获得结构中成员的偏移量。许多文章通过说 NULL 指针实际上从未真正取消引用来掩盖原因,但这对我来说没有意义。
以下是我尝试理解的一些链接:
我正在寻找并试图理解的是对编译器如何解释 MACRO 定义的逐步分解理解,这最终将解释 NULL 指针实际上没有被取消引用。
编辑:尽管其他问题回答了我的疑问,但正如原始帖子中所指出的那样,它们对我来说没有意义。@dasblinkenlight 的回答揭示了我在回答其他问题时遇到的确切问题,即我们实际上没有取消引用指针是怎么回事。
我期待在宏观offsetof的<cstddef>,看到一个可能的实现是通过
#define my_offsetof(type, member) ((void*) &(((type*)nullptr)->member))
Run Code Online (Sandbox Code Playgroud)
我尝试过它确实按预期工作
#include <iostream>
#define my_offsetof(type, member) ((void*) &(((type*)nullptr)->member))
struct S
{
char x;
short y;
int z;
};
int main()
{
std::cout << my_offsetof(S, x) << '\n';
std::cout << my_offsetof(S, y) << '\n';
std::cout << my_offsetof(S, z) << '\n';
S s;
std::cout << (void*) &((&s)->x) << '\n'; // no more relative offsets
std::cout << (void*) &((&s)->y) << '\n'; // no more relative offsets
std::cout << (void*) &((&s)->z) << '\n'; // …Run Code Online (Sandbox Code Playgroud)