【发布时间】:2019-03-22 15:04:14
【问题描述】:
我碰巧需要将sizeof(x) 的结果与ssize_t 进行比较。
当然,GCC 给出了一个错误(幸运的是我(我使用了-Wall -Wextra -Werror)),我决定做一个宏来获得sizeof() 的签名版本。
#define ssizeof (ssize_t)sizeof
然后我可以这样使用它:
for (ssize_t i = 0; i < ssizeof(x); i++)
问题是,我对SSIZE_MAX >= SIZE_MAX 有什么保证吗?我想可悲的是,这永远不会是真的。
或者至少是sizeof(ssize_t) == sizeof(size_t),这会减少一半的值,但仍然足够接近。
我在 POSIX 文档中没有找到 ssize_t 和 size_t 之间的任何关系。
相关问题:
【问题讨论】:
-
需要这个的实际问题是什么?这闻起来像 XY 问题。
-
问题是我只想尽可能避免无符号类型,尤其是在循环中,因此,我总是使用
ssize_t来循环数组。但显然这是ssize_t的糟糕设计。在我的情况下,我没问题,我可以在比较中使用我用来创建 VLA 的相同变量,但最好能够使用ssize_t,目的正是如此。 -
将
size_t与ssize_t进行比较是完全有效的,尽管编译器可能会警告——例如,关于有符号与无符号的比较——它不应该发出 error. -
至于
ssize_t优于size_t,请注意前者不是标准C 定义的。这是一个实证主义。这绝不意味着如果专门为 POSIX 编程,你应该避免它,但至少你应该记住这一点。 -
好的。当然,您可以只使用经过结束测试的循环:
{T i = 0; do { ... } while (i++ < limit); }。这里,T应该是一个无符号类型以避免i++在limit是T_MAX时溢出。 (实际上,整数溢出不会捕获,并且可能溢出的最后一个值永远不会被使用。)