Что произошло с static_cast с несколькими аргументами?

В следующей строке:

f1 = signal(SIGINT, signal_handler);

f1 назначен предыдущий обработчик сигнала (который не является signal_handler в коде), который может не быть указателем на функция, которую вы можете вызвать с аргументом int.

Для достижения эффекта вам нужно определить второй обработчик сигнала и назначить его на f1 после указанной выше строки.

Примерно так:

#include 
#include 

void signal_handler2(int signal)
{
    printf("hahahah2222\n");
}

void signal_handler(int signal)
{
    printf("hahahah\n");
}

int main(void)
{
    void (*f1)(int);
    f1 = signal(SIGINT, signal_handler);
    f1 = signal(SIGINT, signal_handler2);
    f1(3);  //Success
    signal_handler2(3); //OK
    raise(SIGINT);    
}

Вывод:

hahahah
hahahah2222
hahahah2222

См. Live Демо

11
задан Jon Seigel 8 April 2010 в 02:34
поделиться

1 ответ

Статический бросок берет один аргумент, но его аргументом является выражение, и выражения могут включать оператор запятой. Запятая используется в ситуациях, где Вы хотите оценить два или больше выражения сразу для их побочных эффектов, например:

int i, j;
for (i=0, j=0; i < 10; i++,j++) {
    // do stuff
}

Это несколько полезно, потому что без него Вы могли только оценить одно выражение каждый для инициализатора, условия, и продолжить части для цикла (или любое другое место, выражение ожидается). Это обычно не делает для самого четкого кода, тем не менее, и семантика нечетны. Как Вы заметили, разделенная от запятой последовательность оценивает к значению ее последнего выражения.

30
ответ дан 3 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: