2013-06-20 45 views
2

我显示了一些我明白的代码。为什么用圆括号包围函数?

以下代码是示例代码。

static void (_func)(int p); 

int main() 
{ 
.... 
    _func(3); 
.... 
} 

static void (_func)(int p) 
{ 
.... 
} 

一般来说,我知道,功能与括号括起来一起使用“*”的函数指针为(* _func),但上面的代码为什么环绕带括号的函数在函数声明?

有没有理由使用这种方法?

+1

我明白英语不是你的第一语言,但你应该考虑学习正确的单词。这些符号:'()'被称为“括号”。 –

+0

感谢Jonathon Reinhart让我知道与括号相关的正确单词。对于多于一个()和“括号”,只有一个()的圆括号“ – user2503838

+1

” – 0decimal0

回答

3

将parens放在函数名称周围可以防止它被同名的函数宏所“覆盖”。

例如,有时函数可能被实现为一个宏,但它也可能需要被实现为一个实际的函数(其中一个原因可能是为了获得一个指针)。此API的实现者可能会将函数名称和实际函数实现的声明与包装在parens中的名称放在一起,以避免与宏名称发生冲突。

然后,API的用户可以决定,如果出于某种原因他们想要使用实际的函数而不是宏,他们可以使用#undef _func或使用包装在parens中的函数名称来避免使用宏。

如C99 7.1.4中提到“使用的库函数”:

在报头中声明的任何功能可以被附加地实现为在报头中定义的 函数宏,因此,如果一个库函数 包含其标题时明确声明,可以使用下面显示的技术 之一来确保声明不受 这样的宏的影响。因为 名称后面没有跟着左括号,表示 扩展了宏函数名称,所以函数的任何宏定义都可以通过将括号中的函数名称封装在本地,从而被局部地抑制 。出于同样的句法原因,即使 也被定义为宏,它也允许获取库函数的地址。使用#undef删除任何宏定义也将确保引用实际功能。

相关问题