我如何在c中解释(断言)?

时间:2011-03-23 06:12:13

标签: c syntax

void (assert)(int e)
{
    assert(e);
}

这是如何运作的?

3 个答案:

答案 0 :(得分:3)

void (assert)(int e)相当于void assert(int)

你为什么需要它?

考虑以下示例

#include<stdio.h>
void foo(int a)
{
printf("%d", a);
}
#define foo(a) {/*I do nothing*/}

int main()
{
  foo(5); // won't call `foo`
}

如何调用foo,调用它的函数而不是在调用地点替换的宏定义?

解决方案是添加一个额外的括号,如(foo)(5)

类似地,已知assert是一个宏。这就是我能想到的原因。

答案 1 :(得分:2)

由于assert已被定义为函数式宏,如果没有括号,它将在函数头和正文中扩展两者

例如:

#define twice(x) ((x)+(x))
void twice(int i)
{
  return twice(i);
}

将扩展到以下,这显然不合法

void ((int i)+(int i))
{
  return ((i)+(i));
}

另一方面:

#define twice(x) ((x)+(x))
void (twice)(int i)
{
  return twice(i);
}

将扩展为:

void (twice)(int i)
{
  return ((i)+(i));
}

编译器会忽略函数名称周围的额外括号。

这是标准库源代码中经常使用的常用技巧,在其他可能存在具有相同名称的函数和宏的上下文中。

答案 2 :(得分:1)

这是合法的语法,只需用额外的括号来编写它。你这样做的原因是因为assert()通常被定义为一个宏;所以上面的函数存在使assert()成为一个真正的函数,可能因此你可以在其中设置一个断点。