例如:
#include <stdio.h>
typedef void (* proto_1)();
typedef void proto_2();
void my_function(int j){
printf("hello from function. I got %d.\n",j);
}
void call_arg_1(proto_1 arg){
arg(5);
}
void call_arg_2(proto_2 arg){
arg(5);
}
void main(){
call_arg_1(&my_function);
call_arg_1(my_function);
call_arg_2(&my_function);
call_arg_2(my_function);
}
运行这个我得到以下内容:
> tcc -run try.c
hello from function. I got 5.
hello from function. I got 5.
hello from function. I got 5.
hello from function. I got 5.
我的两个问题是:
(* proto)
定义的函数原型与没有定义的函数原型有什么区别?&
)和不使用?答案 0 :(得分:18)
没有区别。有关证据,请参阅C99 specification(第6.7.5.3.8节)。
“参数声明为''函数返回类型''应调整为''指针指向 函数返回类型'',如6.3.2.1。“
答案 1 :(得分:7)
作为争论传递时,&function
和function
之间没有区别
但是你的typedef之间存在差异。我不知道官方的解释,即究竟是什么区别,但我记得
typedef void (*name1)(void);
和
typedef void(name2)(void);
是不同的:
name1是指向不带参数且不返回任何内容的函数的指针
name2是一个不带参数且不返回任何内容的函数
你可以通过编译来测试它:
typedef void (*pointer)(void);
typedef void (function)(void);
void foo(void){}
int main()
{
pointer p;
function f;
p = foo; //compiles
p();
f = foo; //does not compile
f();
}
再一次,我不是解释这种行为的确切原因的合适人选,但我相信如果你看一下标准,你会在某处找到解释
答案 2 :(得分:5)
&amp;功能和功能之间没有区别 - 它们都是地址。您可以通过打印它们来看到这一点:
function bar();
....
printf("addr bar is 0x%d\n", &bar);
printf("bar is 0x%d\n", bar);
答案 3 :(得分:2)
区别仅在于风格。使用函数指针时有相同的情况:
void func (void);
...
void(*func_ptr)(void) = func;
func_ptr(); // call func
(*func_ptr)(); // call func
printf("%d\n", ptr);
printf("%d\n", *ptr);
有些人说(* func_ptr)()语法是首选,要明确函数调用是通过函数指针完成的。其他人认为带*的风格更清晰。
像往常一样,很可能没有科学研究证明任何一种形式都比另一种更好,所以只选择一种风格并坚持下去。