在以下代码中,我有几个问题:
不带符号&
的函数名称如何给出函数的地址值?这是由于编译器的智能吗?还是这种允许的c语法?
是否可以将名称fun
重用于任何变量声明?是否应该进行任何链接器拆解以实现此目的?
void fun(int a)
{
printf("Value of a is %d\n", a);
}
int main()
{
void (*fun_ptr)(int) = fun;
fun_ptr(10);
return 0;
}
答案 0 :(得分:0)
如standard中所述,由于函数到指针的转换,对于函数指针,不必使用&
:
void f(int);
void (*pf1)(int) = &f;
void (*pf2)(int) = f; // same as &f
答案 1 :(得分:0)
函数,如数组,自然会衰减到指针。在期望使用指向函数的指针时使用fun
会使编译器将其视为&fun
。
不,您不能使用fun
作为变量名,因为这将隐藏具有相同名称的函数,这意味着您不能使用函数{{1} }(在该范围内,fun
的所有用法都引用了变量)。这种隐藏发生在编译中。
答案 2 :(得分:0)
函数指定符(即在表达式中使用fun
时所拥有的)是C语言的定义部分,而不是{{1 }},sizeof
或一元运算符_Alignof
的值等于指向该函数的指针。因此,您的&
声明就可以了。
void (*fun_ptr)(int) = fun;
不能在文件作用域中用作另一个声明符,无论它是变量还是其他函数。您可以 在块范围内使用变量声明对其进行阴影处理(这同样适用于文件范围的变量声明)。