例如:
#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)
定义的函数原型和没有定义的函数原型有什么区别?&
)调用函数和不使用引用运算符调用函数有什么区别?发布于 2011-06-09 21:32:26
这是没有区别的。有关证据,请参阅C99 specification (第6.7.5.3.8节)。
“将参数声明为”“函数返回类型”“应调整为”“指向函数返回类型的指针”“,如6.3.2.1中所示。”
发布于 2011-06-09 21:20:50
作为论据传递时,&function
和function
之间没有区别
但是,您的typedefs之间存在差异。我不知道官方的解释,也就是说到底有什么不同,但根据我的记忆
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();
}
再说一次,我不适合解释这种行为的确切原因,但我相信,如果你看看标准,你会在某个地方找到解释。
发布于 2011-06-09 21:26:48
&function和function没有区别--它们都是地址。您可以通过同时输出这两个命令来查看:
function bar();
....
printf("addr bar is 0x%d\n", &bar);
printf("bar is 0x%d\n", bar);
https://stackoverflow.com/questions/6293403
复制相似问题