小编net*_*cat的帖子

减去2 size_t的类型是什么?

C中应该使用哪种类型来表示两个对象大小之间的差异?

size_t未签名的那样

size_t diff = sizeof (small_struct) - sizeof (big_struct);
Run Code Online (Sandbox Code Playgroud)

显然不正确,在我看来,没有真正的签名等价物.

ptrdiff_t 听起来很诱人,但是

  1. 就像它的名字所说它是用于减去指针.
  2. 我已经读过,例如像DOS这样的分段平台的最大对象大小为64k,可以用16位表示.然而,远指针由16位段值和16位偏移值组成.ptrdiff_t这样的32位平台也不会这样吗?如果是这样,两个对象的大小之间的差异只需要16位,但使用ptrdiff_t会得到一个32位宽的变量,使其不是最佳的.

那么,什么是适合这种价值的便携式?

Edit: 我知道ssize_t,但它是

  1. 不属于标准C.
  2. 实际上并非打算用于此类用途,而是用于返回大小或(负)错误值.

c size-t

21
推荐指数
2
解决办法
4509
查看次数

禁用"警告:'x'的地址将始终评估为'true'"

问题是这样的:

#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 …

c macros gcc compiler-warnings suppress-warnings

5
推荐指数
1
解决办法
6966
查看次数

标签 统计

c ×2

compiler-warnings ×1

gcc ×1

macros ×1

size-t ×1

suppress-warnings ×1