Указатель на функцию с именованными аргументами? - PullRequest
16 голосов
/ 26 апреля 2019

Недавно я столкнулся со странным синтаксисом в программе на Си.

struct connector_agent_api{
    bool (*receive)(slot *s, uint8_t *data, uint8_t length);
}

Является ли "receive" указателем на функцию?

Если это указатель на функцию, почему он имеет именованные аргументы? Это должно быть похоже на следующий?

bool (*receive)(slot *, uint8_t *, uint8_t);

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

Ответы [ 2 ]

18 голосов
/ 26 апреля 2019

Имена аргументов в указателе функции являются необязательными, так же как имена аргументов в объявлении функции являются необязательными. Это связано с тем, что имена параметров, если они указаны, не используются, поэтому разрешены оба формата.

В разделе 6.7.6.3 стандарта C , касающемся объявлений функций, который включает как прототипы функций, так и указатели функций, параграф 6 гласит:

Список типов параметров указывает типы и может объявить идентификаторы для параметров функции.

Единственное место, где для параметров функции требуется имя, - это фактическое определение функции.

Для определения функции в Разделе 6.9.1p5 говорится:

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

4 голосов
/ 26 апреля 2019

Что заставляет вас думать, что это странный синтаксис?Это действительная декларация согласно стандарту C.То, что параметры названы, не имеет значения.Наименование таких параметров в этом случае необязательно.Это может быть очень полезно, если вы или кто-то еще используете IDE, потому что он может отображать полный прототип при использовании указателя функции для вызова функции и, таким образом, давать подсказку кодеру об аргументах, которые должны быть предоставлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...