【问题标题】:Why this form is correct in C?为什么这种形式在 C 中是正确的?
【发布时间】:2013-05-31 08:06:38
【问题描述】:

我在 C 中有这段代码:

void f(void *x) {
    printf(">>> %p\n", x);
}

int main() {

  f NULL;
    return 0;
}

我认为是针对 NULL 的定义,但我想解释一下以澄清我的疑问。

【问题讨论】:

  • 你到底不喜欢这里什么?
  • iirc NULL 是一个#define'd to ((void*)0),所以当它被复制进去时,你有 f((void*)0) 作为函数的参数跨度>
  • 第一次看到f NULL这种形式。
  • 如果您正在运行 gcc,请尝试 gcc -E 看看会发生什么。我想你会明白的

标签: c null


【解决方案1】:

如果NULL 被定义为((void *)0) 或(0),那么这将扩展为f ((void *)0) 或f (0),它们是正确的函数调用。编译期间任何非括号内的代码都会出错。

【讨论】:

  • 我投了反对票,并在注意到这是“星期一早上”时刻后删除了我的反对票……
  • @JohannesSchaub-litb 啊,好的。我明白了。
  • 非常感谢您的解释。
  • 对于 C 语言的程序员来说,这可能是一个愚蠢的问题。我是 C 的初学者(但我喜欢它!!)。 ;)
【解决方案2】:

在C中NULL通常定义如下:

#if !defined(NULL)
    #define NULL ((void*)0)
#endif

如果是这种情况,那么NULL 只是一个特殊的指针,你的例子就可以了。

【讨论】:

  • 不,C 标准没有定义 NULL 应该如何定义。
  • 另外,NULL 不是 指向地址 0 的指针。相反,当在指针上下文中遇到 字面值 0 时,它是空指针。空指针的实际值是特定于实现的,可以是任何值。
  • 公平地说,标准说 NULL 的定义是特定于实现的。但是在第 6.3.2.3 节第 3 部分中,在 open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf 中。它表示将 0 强制转换为 (void *) 称为空指针常量。
  • @jbr:确实,literal 0 给出了一个空指针。但例如,这不是(技术上)空指针:int a = 0; void* p = (void*)a;。
猜你喜欢
  • 2011-04-19
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多