这个宏是什么意思?

时间:2014-11-12 13:11:27

标签: c macros

#define TRASHIT(x)  do {(x) = (void *)-1;} while (0)

我在sys/queue.h中遇到了这个宏,然后谷歌搜索但却没有找到任何有用的内容。 此宏将指针x设置为(void *)-1,但(void *)-1是什么意思?这与NULL之间有什么区别?

4 个答案:

答案 0 :(得分:2)

它将x设置为一个指针值,其解除引用可能是未定义的行为(因为你不太可能拥有该地址的内存,如果有的话)。

do while(0)循环是编写宏时使用的相当标准的习惯用法:它强制用户在使用时附加分号,并且可以帮助控制宏实现中引入的变量范围。当然,循环中的语句只执行一次。

答案 1 :(得分:1)

该标准没有规定

的任何行为
(void*)-1;

除了建议使整数和指针之间的映射对于底层平台寻址模型而言是自然的。

因此,如果您的实现允许创建无效指针,那么可能是一个设置了所有位的void-pointer值。

空指针在源中由常量积分表达式(可能转换为void*)或以某种实现定义的方式表示。
在大多数现代系统中,它是一个空位指针,所有位都清晰。

因此,虽然两个可以相同,但不太可能,尤其是在现代系统上。 此外,第二个非常不太可能是有效的指针

答案 2 :(得分:1)

这很可能是指与NULL不同的无效指针,用作标记或错误指示。我们可以在man page for shmat中找到这种类型的例子(强调我的):

  

成功时shmat()返回附加共享内存的地址   分割; on error(void *)-1返回,并且errno设置为   指出错误的原因。

所以为了标记错误shmat返回(void *) -1这是一个带有不同值的无效指针。

问题Is ((void *) -1) a valid address?处理这种指针的有效性。

答案 3 :(得分:0)

我想,它只是用于返回错误类型,如下所示:

#define TRASHIT(x)  do {(x) = (void *)-1;} while (0)

void* foo (void) {

    void* ret;

    if(fail) {
        TRASHIT(x);
    }
    else {
        sometingelse(x);
    }

    return ret;
}