【发布时间】:2017-12-12 16:12:25
【问题描述】:
是否可以围绕“sizeof 表达式”创建一个内联函数包装器,它返回一个有符号数?
包装函数会是什么样子?它应该适用于所有类型的表达式(C 数组等),因此它可以一对一地替换 sizeof,但它返回一个有符号数。
所以,基本上,我想要一个ssizeof,它返回一个带符号的数字,如下所示:
constexpr std::ptrdiff_t ssizeof(X) {
return static_cast<std::ptrdiff_t>(sizeof(X));
}
例如:
long a;
int b = 8;
// no signed/unsigned comparison warning here, because
// ssizeof(a) returns a signed number
if (ssizeof(a)<b) {
}
解决方案可能没那么简单,因为自动数组->指针衰减规则(也许还有其他问题?)。
如果无法进行一对一替换(因为ssizeof 的参数将始终被评估),如果允许评估,是否可以这样做?
【问题讨论】:
-
如果你想要一个函数,那么它就不能用于类型,例如
ssizeof(int)。为此使用 宏 怎么样?我知道宏通常不好,但在这种情况下,只有#define SIZEOF(x) ...似乎有效。除了您传递给它的表达式之外,还需要未评估,但ssizeof(f())不能确保f()是未评估。 -
好吧,它不能是一个函数,因为
sizeof应该是不求值的表达式。 -
你最好停止使用有符号值,而不是尝试编写自己的 sizeof()
-
虽然你真的不应该这样做,但你可以使用宏来“自动化”你的投射:
#define MY_SIZEOF(x) std::ptrdiff_t(sizeof(x)) -
@Slava 不,unsigned 是 PITA,如果使用有符号 size_t 会更好(当然,在 16 位硬件的糟糕时代,这是不可能的)。
标签: c++