Что делает компилятор, когда мы определяем функцию? И является ли имя функции указателем? Или, может быть, это что-то еще.
Хотел бы я знать что-нибудь об именах функций.
Это просто идентификатор. Всякий раз, когда он используется в большинстве выражений, он «распадается» до указателя на функцию, точно так же, как имя массива при использовании в большинстве выражений «распадается» до указателя на первый элемент.
Я думаю, это хороший вопрос. Мы всегда должны спрашивать себя, что представляют собой вещи, которые мы используем, и интересоваться, как они работают внутри.
Что означает имя функции в C
Имя функции обозначает функцию.
Что делает компилятор, когда мы определяем функцию?
Компилятор запоминает имя функции и генерирует код для ее реализации. Он также запоминает информацию из объявления функции, такую как тип возвращаемого значения и типы параметров, если использовалась форма-прототип.
И является ли имя функции указателем? Или, может быть, это что-то еще.
Имя функции обозначает функцию.
Когда имя функции используется в выражении, оно автоматически преобразуется в указатель на функцию, за несколькими исключениями, обсуждаемыми ниже. Кроме того, фактически единственное использование имени функции — это указатель на функцию. Из-за этого программист может думать об имени функции как об указателе, но на самом деле это не указатель.
Единственным исключением из автоматического преобразования является использование имени функции с sizeof
. Однако использование sizeof
для функции обычно является ошибкой (оно не определено стандартом C и может работать, только если реализация C определяет его как расширение), поэтому это исключение никогда не используется в обычной практике. Другое исключение — когда имя функции используется с унарным &
, как в &sin
. В данном случае мы явно берем адрес функции, которая выдает указатель на функцию, поэтому нет необходимости в автоматическом преобразовании в указатель на функцию.
Когда вы вызываете функцию, как в случае sin(x)
, «оператор вызова функции» ( … )
принимает указатель на функцию в качестве своего первого операнда. Таким образом, из-за автоматического преобразования sin(x)
фактически является (&sin)(x)
, что говорит о вызове функции с адресом &sin
и передаче ей аргумента x
.
Тот факт, что оператор вызова функции принимает указатель на функцию, является причиной того, что мы можем использовать указатели для функций, как в double (*p)(double) = sin; printf("sin(.5) = %g.\n", p(.5));
.
Как оператор вызова функции получает указатель на функцию? Можете ли вы рассказать мне что-нибудь об этом?
Стоит отметить, что параметры функции функционального типа преобразуются в указатели на функции. Это int(int())
эквивалентно int(int(*)())
Это просто имя (символ) для компилятора и компоновщика. In не будет присутствовать в вашем исполняемом файле\