我展示了一些我明白的代码。
以下代码是示例代码。
static void (_func)(int p);
int main()
{
....
_func(3);
....
}
static void (_func)(int p)
{
....
}
一般来说,我知道用括号括起来的函数用'*'作为函数指针(* _func),但是上面代码为什么在函数声明时用括号括起函数?
有什么理由使用这种方法吗?
答案 0 :(得分:3)
在函数名称周围放置parens将阻止它被具有相同名称的类似函数的宏“覆盖”。
例如,有时函数可能被实现为宏,但它也可能需要实现为实际函数(一个原因可能是可以获得指向它的指针)。该API的实现者可能会将函数名称和实际函数实现的声明与包含在parens中的名称放在一起,这样就不会与宏名称冲突。
然后,API的用户可以决定,无论出于何种原因,他们想要使用实际函数而不是宏,他们可以#undef _func
或使用包含在parens中的函数名来避免使用宏。 / p>
如C99 7.1.4“库函数的使用”中所述:
标头中声明的任何函数都可以另外实现为a 标题中定义的类似函数的宏,所以如果库函数是 在包含标题时明确声明,这是一种技术 如下所示可用于确保声明不受影响 这样的宏。可以抑制函数的任何宏定义 本地通过将函数的名称括在括号中,因为 然后,该名称后面没有表示的左括号 扩展宏功能名称。出于同样的语法原因,它 允许获取库函数的地址,即使它是 也定义为宏。使用#undef删除任何宏 定义还将确保引用实际函数。