为什么可以将 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平台的编译器设置从一开始就是仁慈的,不能突然改变。许多现有的代码将无法编译。
我一直不专心,出于某种原因创建了一个带有两个参数的函数,然后我将它传递给 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平台的编译器设置从一开始就是仁慈的,不能突然改变。许多现有的代码将无法编译。