В чем разница между `& function` и` function` в C в качестве аргументов? - PullRequest
19 голосов
/ 09 июня 2011

Например:

#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), и один, определенный без?
  • В чем разница между вызовом функции с оператором ссылки (&) и без?

Ответы [ 4 ]

18 голосов
/ 09 июня 2011

Разницы нет.В качестве доказательства см. Спецификацию C99 (раздел 6.7.5.3.8).

"Объявление параметра как" функции, возвращающего тип "должно быть скорректировано на" указатель на функцию "тип возврата '', как в 6.3.2.1. "

7 голосов
/ 09 июня 2011

нет разницы между &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();
}

Опять же, я не тот человек, чтобы объяснять точную причину такого поведения, но я верю, что если вы посмотрите на стандарты, вы найдете объяснение где-то там

5 голосов
/ 09 июня 2011

Нет разницы между & function и function - они оба адреса.Вы можете увидеть это, напечатав их оба:

function bar(); 

.... 
printf("addr bar is 0x%d\n", &bar);
printf("bar is 0x%d\n", bar);
2 голосов
/ 09 июня 2011

Разница только в стилистике.У вас тот же сценарий при использовании указателей на функции:

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) () предпочтительнее, чемдать понять, что вызов функции осуществляется через указатель на функцию.Другие считают, что стиль с * более понятен.

Как обычно, нет научных исследований, доказывающих, что любая форма лучше другой, поэтому просто выберите один стиль и придерживайтесь его.

...