Arduino中delay+(1000)语法合法性及编译差异咨询
解析Arduino中
delay+(1000)这类非标准写法的现象 咱们来拆解这个你偶然发现的有意思现象——你误写的delay+(1000)其实是函数指针算术操作,完全不是合法的函数调用语法,结合你做的几个测试,我给你捋清楚背后的逻辑:
1. 不同编译器的编译差异原因
- Arduino IDE能编译的原因:它在编译时默认添加了一些定制化的编译选项和预处理逻辑,对部分非标准写法有一定容忍度,但这并不代表该写法符合C/C++标准。
- avr-gcc/avr-g++/gcc/g编译失败:这些编译器严格遵循C/C标准,会直接指出这种不符合语法规范的写法。
2. delay+(1000)输出数值的本质
在C/C++中,函数名可以隐式转换为指向该函数的指针。所以delay+(1000)实际上是将delay函数的指针地址加上1000字节,你看到的类似1132的数值就是这个偏移后的地址值——和delay()函数的延时功能没有半毛钱关系。
3. 不同运算符的编译结果差异
- 可编译的
+/-操作:指针算术仅支持加减运算(因为地址的偏移是有实际意义的),所以delay+(1000)、delay-(1000)符合指针算术的语法规则,能通过编译。 - 编译报错的
*//操作:指针不支持乘除运算,标准C/C++完全不允许这类操作,所以编译器直接报错。 - 强制转换后可编译的情况:
int t = (int)delay*(1000);
这里你把函数指针delay强制转换成了int类型,此时变成了普通的整数乘法运算,自然符合语法规则,所以能编译通过。
4. 为什么不会触发函数调用
所有delay<运算符>(x)的写法,都是对函数指针进行算术操作,而非调用函数。只有delay(x)这种带括号的语法才是函数调用——括号是触发函数执行的关键标志,运算符只会作用于指针本身。
5. 开启编译警告后的提示意义
当你在Arduino IDE中开启全部编译警告时,编译器给出的指针算术操作和语句无效果警告,其实是在明确提醒你:你写的代码没有执行预期的延时功能,只是做了一个无意义的指针运算,而且运算结果没有被使用,属于无效代码。
内容的提问来源于stack exchange,提问作者Saurabh P Bhandari
相关产品推荐
相关产品推荐

