在C中,作为参数传递时,`&function`和`function`有什么区别?

bri*_*ice 20 c functional-programming function operators

例如:

#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);
}
Run Code Online (Sandbox Code Playgroud)

运行这个我得到以下内容:

> 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.
Run Code Online (Sandbox Code Playgroud)

我的两个问题是:

  • 定义的函数原型(* proto)和没有定义的函数原型有什么区别?
  • 使用引用operator(&)调用函数和不调用函数有什么区别?

Nic*_*cue 21

没有区别.有关证据,请参阅C99规范(第6.7.5.3.8节).

"参数声明为''函数返回类型''应调整为''函数返回类型的指针'',如6.3.2.1所述."


Hay*_*tuk 7

作为争论时,&function和之间没有区别function

但是你的typedef之间有区别.我不知道官方的解释,即究竟是什么区别,但我记得

typedef void (*name1)(void);
Run Code Online (Sandbox Code Playgroud)

typedef void(name2)(void);
Run Code Online (Sandbox Code Playgroud)

是不同的:

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();
}
Run Code Online (Sandbox Code Playgroud)

再次,我不是解释这种行为的确切原因的合适人选,但我相信如果你看看标准,你会发现那里的解释


Sco*_*son 6

&function和function之间没有区别 - 它们都是地址.您可以通过打印它们来看到这一点:

function bar(); 

.... 
printf("addr bar is 0x%d\n", &bar);
printf("bar is 0x%d\n", bar);
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,在十进制数之前打印一个"0x"是相当不正常的...... :-) (5认同)
  • 你的答案是正确的,但"你可以通过......看到这个"是错误的.对于一个数组,`array`和`&array`不是一样的(它们有*非常*不同的类型!)但是用`printf`打印它们的地址会显示相同的东西(假设你正确使用`%p`而不是`%d`并强制转换为`void*`).BTW没有办法用`printf`打印函数指针,因为C完全没有从函数指针类型到`void*`或任何整数类型的任何转换. (4认同)
  • 该代码通过将不匹配的类型传递给`printf`来调用未定义的行为.如果它符合您的预期,那就意味着您运气不好,即您的代码中的错误未被检测到. (2认同)