【问题标题】:What does this macro mean?这个宏是什么意思?
【发布时间】:2015-01-09 08:32:11
【问题描述】:
#define TRASHIT(x)  do {(x) = (void *)-1;} while (0)

我在sys/queue.h 中遇到了这个宏,然后用谷歌搜索,但没有发现任何有用的信息。 这个宏将指针x 设置为(void *)-1,但是(void *)-1 是什么意思呢?这和NULL有什么区别?

【问题讨论】:

标签: c macros


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    #define TRASHIT(x)  do {(x) = (void *)-1;} while (0)
    
    void* foo (void) {
    
        void* ret;
    
        if(fail) {
            TRASHIT(x);
        }
        else {
            sometingelse(x);
        }
    
        return ret;
    }
    

    【讨论】:

    【解决方案3】:

    它将x 设置为一个指针值,对于该指针值,取消引用可能是未定义的行为(因为您不太可能拥有该地址处的内存,如果有的话)。

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

    【讨论】:

      【解决方案4】:

      标准没有规定任何行为

      (void*)-1;
      

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-05-16
        • 1970-01-01
        • 2015-11-03
        • 2014-04-25
        • 2011-04-11
        • 2018-10-29
        • 1970-01-01
        • 2018-11-23
        • 2017-05-25
        相关资源
        最近更新 更多