一尘不染

sizeof运算符的实现

linux

我已经尝试实现sizeof运算符。

#define my_sizeof(x) ((&x + 1) - &x)

但是,对于任何一种数据类型,结果总是以“ 1”表示。

然后,我为此搜索了一下..,我发现代码是 强制转换的

#define my_size(x) ((char *)(&x + 1) - (char *)&x)

如果代码是强制转换的,那么代码也可以正常工作。.我不明白为什么..该代码也完美地填充了结构。

它也为

#define my_sizeof(x) (unsigned int)(&x + 1) - (unsigned int)(&x)

有人能解释一下如果进行类型转换和未进行类型转换如何工作吗?

提前致谢..


阅读 468

收藏
2020-06-03

共1个答案

一尘不染

指针减法的结果以 元素 为单位,而不是以字节为单位。因此,第一个表达式1的定义为。

除此之外,您确实应该在宏中使用括号:

#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)

否则,尝试my_sizeof()在表达式中使用可能导致错误。

2020-06-03