Я наткнулся на этот фрагмент кода и полностью потерял интерпретацию его значения.
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
Что такое подробное объяснение кода в строке 2?
Я знаю, что void
и int
являются типами, * func является указателем на функцию, а скобки для приоритета. Но я до сих пор не получаю (* сигнал...), (int), и все это объединяется вместе. Чем детальнее, тем лучше.
Возможно, я знал смысл/эффект этой декларации. Но мне пришлось сделать еще несколько проб, чтобы помочь мне понять, что происходит, как показано ниже:
1 #include <signal.h>
2 void (*signal)(int sig, void (*func)(int));
3 void (*signal)(int); // then void (signal)(int) again.
4 //void (*signal(int sig, void (*func)(int)))(int); //break this line into two lines above
5
6 int main(){}
В приведенном выше коде я сломал void (*signal(int sig, void (*func)(int)))(int)
на две строки. Для строки 3 я попробовал как void (*signal)(int)
, так и void (signal)(int)
, с тем же результатом ошибки, который указывал на то, что я пытался обновить signal
:
TestDeclaration.c: 2: ошибка: "сигнал" обновлен как другой вид символа /usr/include/signal.h:93: error: предыдущая декларация 'signal' была здесь
TestDeclaration.c: 3: ошибка: "сигнал" обновлен как другой вид символа /usr/include/signal.h:93: error: предыдущее объявление 'signal' было здесь
Теперь я знаю, что оба испытания являются неправильными способами объявления, но почему они неправильны? Почему исходный способ декларации НЕ является повторной декларацией?