Разрешены ли имена параметров в определениях указателей функций

Итак, я только что увидел пример объявления указателя на функцию, который использует именованные параметры:

int (*func)(int a, int b) = &foo;

Я предполагаю, что это хорошо определенный код, потому что он компилируется и работает нормально: https://ideone.com/C4mhsI

Но я никогда не видел этого раньше (возможно, потому, что это увеличивает сложность и без того сложного для разбора указателей функций). Тем не менее, я хотел бы увидеть утверждение, что это допустимо, а не какое-то сумасшедшее расширение gcc. Может кто-нибудь найти мне что-нибудь?

2

Решение

Вы можете следовать грамматике описатель, который является объявлением без каких-либо спецификаторов типа или decl.

declarator:
ptr-declarator
[...]

ptr-declarator:
noptr-declarator
ptr-operator ptr-declarator

noptr-declarator:
[...]
noptr-declarator parameters-and-qualifiers
( ptr-declarator )

parameters-and-qualifiers:
( parameter-declaration-clause ) [...]

ptr-operator:
* attribute-specifier-seq[opt] cv-qualifier-seq[opt]
[...]

Я удалил все грамматические правила, которые не нужны, чтобы легче им следовать. Я не буду этого делать, потому что это немного сложно записать, но в конце вы обнаружите, что у вас есть Параметры и-классификаторы это представляет параметры.

И если вы сделаете это для функции, вы увидите, что это также заканчивается Параметры и-классификаторы. Они используют одну и ту же грамматику, и ничто не запрещает это в стандарте под [Decl.ptr].

6

Другие решения

Как и вы, вы можете указать имя аргумента в объявлении функции:
int funct(int a, int b); вы можете в функциональных указателей тоже int (*func)(int a, int b), В обоих случаях имена ничего не делают, и на практике они используются в качестве вспомогательного средства документирования для облегчения чтения.

-1

По вопросам рекламы [email protected]