为啥可以将 void(*)(int x, int y) 传递给期望 void(*)() 的 attachInterrupt?

Posted

技术标签:

【中文标题】为啥可以将 void(*)(int x, int y) 传递给期望 void(*)() 的 attachInterrupt?【英文标题】:Why is it possible to pass a void(*)(int x, int y) to attachInterrupt that expects void(*)()?为什么可以将 void(*)(int x, int y) 传递给期望 void(*)() 的 attachInterrupt? 【发布时间】:2021-12-28 18:29:52 【问题描述】:

我一直不专心,并且由于某种原因创建了一个接受两个参数的函数,然后我将它传递给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,也许它很重要。

【问题讨论】:

【参考方案1】:

AVR 板的编译器设置允许。

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

在其他 Arduino 平台(SAMD、STM32、esp8266)上,这是一个错误。

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

【讨论】:

以上是关于为啥可以将 void(*)(int x, int y) 传递给期望 void(*)() 的 attachInterrupt?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 List.add(E) 返回 boolean 而 List.Add(int, E) 返回 void?

为啥会产生浮点异常?

用 int main(void) 编译失败; main(int argc, char *argv[]) 成功。为啥?

为啥我们需要在 C++ 中使用 `int main` 而不是 `void main`? [复制]

java里面既然可以用int定义整形变量,为啥还要用Integer,求大神详细解答

int fun(int x){int p;if(x == 0 || x==1) return p=3;else p = x-fun(x-2);}void main(){printf(“%d “)}(代