Поскольку 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));
}
Дополнительные скобки вокруг имени функции просто игнорируются компилятором.
Это распространенный прием, часто используемый в источнике стандартной библиотеки, в других контекстах, где могут быть функциии макросы с тем же именем.