为什么可以将 void(*)(int x, int y) 传递给需要 void(*)() 的 attachInterrupt?

Why is it possible to pass a void(*)(int x, int y) to attachInterrupt that expects void(*)()?

我一直不专心,出于某种原因创建了一个带有两个参数的函数,然后我将它传递给 attachInterrupt,如下所示:

int state = 42;
void simplified_state_handler(){
    state++;
}

void interrupt_func(int x, int y) {
    simplified_state_handler();
}

attachInterrupt(digitalPinToInterrupt(10), interrupt_func, CHANGE);

代码编译时没有任何抱怨,甚至可以正常工作。现在,过了一会儿,我真的不明白为什么。阅读和挖掘 attachInterrupt 代码没有帮助。请解释为什么我可以完全传递这样的功能。我在示例中保留了(现在)无用的 simplified_state_handler,也许它很重要。

AVR 板的编译器设置允许它。

只是一个warning: invalid conversion from 'void (*)(int, int)' to 'void (*)()' [-fpermissive]

在其他Arduino平台(SAMD、STM32、esp8266)上报错。

AVR平台的编译器设置从一开始就是仁慈的,不能突然改变。许多现有的代码将无法编译。