C中应该使用哪种类型来表示两个对象大小之间的差异?
像size_t未签名的那样
size_t diff = sizeof (small_struct) - sizeof (big_struct);
Run Code Online (Sandbox Code Playgroud)
显然不正确,在我看来,没有真正的签名等价物.
ptrdiff_t 听起来很诱人,但是
ptrdiff_t这样的32位平台也不会这样吗?如果是这样,两个对象的大小之间的差异只需要16位,但使用ptrdiff_t会得到一个32位宽的变量,使其不是最佳的.那么,什么是适合这种价值的便携式?
Edit:
我知道ssize_t,但它是
问题是这样的:
#define do_stuff(ret) ((ret) ? getstuff(ret) : 0)
int var;
do_stuff(&var);
test.h:34:46: warning: the address of 'var' will always evaluate as 'true' [-Waddress]
Run Code Online (Sandbox Code Playgroud)
do_stuff但是,它作为一个函数接受一个可以为NULL的输出指针,因此警告没有用,但很烦人.有没有办法让代码让gcc停止抱怨?也许是(至少是那种)便携式的?
顺便说一句.do_stuff必须是一个宏,因为ret实际上是以通用的方式设置(为简单起见,这里被剥离).
编辑:再次,我只想拥有通常的输出指针,它可以是NULL,但在宏而不是函数内.实际代码如下所示:
#define retrieve(x, ret) \
( ret ? (*ret = x.buf[0], 1) : 0 )
Run Code Online (Sandbox Code Playgroud)
当使用它时,它从上面发出警告retrieve(stuff, NULL).根据Adriano Repetti的回答,我将其更改为:
#define retrieve(x, ret) \
( ((void *)ret != NULL) ? (*ret = x.buf[0], 1) : 0 )
Run Code Online (Sandbox Code Playgroud)
这有用,但现在给了我,warning: dereferencing 'void *' pointer因为它扩展到( ((void *)NULL …