Мнемоника, которую я создал много лет назад, которая неоценима при попытке понять сложные типы:
Remember these rules for C declares
And precedence never will be in doubt
Start with the Suffix, Proceed with the Prefix
And read both sets from the inside, out.
За исключением случаев, когда скобки меняют этот приоритет, конечно.
Применяя его к этомуcase:
void (*signal(int sig, void (*func)(int)))(int);
signal is:
[inside parentheses]
[suffix ()] a function, whose arguments are
sig, which is [prefix int] an integer, and
func, which is:
[inside parentheses]
[no suffix within these parens]
[prefix *] a pointer to
[suffix ()] a function, whose argument is
an int
[no more suffixes]
[prefix void] and which returns void
[no more prefixes]
[no more arguments]
[prefix *] And which returns a pointer to
[no more prefixes within these parens]
[suffix ()] a function, whose argument is
an int
[no more suffixes]
[prefix void] and which returns void.
Немного потренировавшись, вы доберетесь до точки, где вы можете сделать все это на лету:
"Signal is function, whose arguments are:
sig, an integer,
and func, a pointer to a function whose argument is an int and which returns void
... which returns a pointer to a function that takes int as an argument and returns void.
(извините за ошибку в первый разout - я не практикуюсь.)
Да, эта мнемоника (с подразумеваемым «кроме скобок, конечно») работает для всех объявлений C, независимо от того, насколько плохо работают указатели, массивы и функции
Это ДЕЙСТВИТЕЛЬНО полезный навык, который нужно иметь при попытке выяснить, как работает чужой код ... или даже выяснить что-то свое, чего вы давно не видели.
Но, да, лучший способ справиться с чем-то, что, как вы думаете, люди не смогут прочитать с первого взгляда, - это создать его в слоях с typedef. Типы компонентов, вероятно, будут полезны для них.и делает шаг за шагом, чтобы люди не терялись, пытаясь понять, какая скобка соответствует какой.Будьте добры к следующему человеку, который прикоснется к вашему коду!
Если вы найдете мнемонику полезной, не стесняйтесь цитировать ее в другом месте - просто дайте мне честь как ее автору, пожалуйста.
Кстати, есть также инструменты "C Explainer", которые будут анализировать ошибки C и выполнять преобразование в английское описание для вас.Моя была названа CEX, по понятным причинам, но существует множество других, и вы сможете найти такой, если не хотите передавать этот навык мокрой посуде или если кто-то вручает вам что-то действительно уродливое, чтобы вы могли отследить.