Назначение указателя на функцию - PullRequest
0 голосов
/ 23 сентября 2019

В следующем коде у меня есть несколько вопросов:

  1. Как имя функции без символа & дает значение адреса функции?Это связано с интеллектом компилятора?или это допустимый синтаксис c?

  2. Можно ли повторно использовать имя 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; 
}

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Функции, как и массивы, естественно распадаются на указатели.Использование fun, когда ожидается указатель на функцию, приводит к тому, что компилятор обрабатывает его как &fun.

И нет, вы не можете использовать fun в качестве имени переменной, так как это будет скрыть функцию с тем же именем, что означает, что вы не можете использовать функцию fun (поскольку в этой области все применения fun ссылаются на переменную).Это сокрытие происходит при компиляции.

0 голосов
/ 23 сентября 2019

Это определенная часть языка C, обозначение функции (это то, что вы имеете, когда используете fun в выражении), то есть , а не операнд sizeof, _Alignof или унарные - & операторы вычисляют указатель на функцию.Таким образом, ваше объявление void (*fun_ptr)(int) = fun; прекрасно.

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

0 голосов
/ 23 сентября 2019

Как уже упоминалось в стандарте , из-за преобразования функции в указатель использование & необязательно для указателей на функции:

void f(int);
void (*pf1)(int) = &f;
void (*pf2)(int) = f; // same as &f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...