Как мне интерпретировать (утверждать) здесь, в с? - PullRequest
2 голосов
/ 23 марта 2011
void (assert)(int e)
{
    assert(e);
}

Как это работает здесь?

Ответы [ 3 ]

3 голосов
/ 23 марта 2011

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)

Аналогично1016 * уже известен как макрос.Вот почему я могу думать.

2 голосов
/ 23 марта 2011

Поскольку 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));
}

Дополнительные скобки вокруг имени функции просто игнорируются компилятором.

Это распространенный прием, часто используемый в источнике стандартной библиотеки, в других контекстах, где могут быть функциии макросы с тем же именем.

1 голос
/ 23 марта 2011

Это допустимый синтаксис, просто пишите его с дополнительными скобками.Причина, по которой вы это сделаете, заключается в том, что assert() часто определяется как макрос;поэтому вышеприведенная функция существует для того, чтобы assert() была реальной функцией, возможно, чтобы вы могли установить в ней точку останова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...