C++ 这是函数调用吗;延迟+;(1000)“;语法正确吗?
我正在编写一个小代码,以便在传感器读数高于某个阈值时启用蜂鸣器。为了启用蜂鸣器一秒钟,我通过调用此函数给出了1000毫秒的延迟:C++ 这是函数调用吗;延迟+;(1000)“;语法正确吗?,c++,c,arduino-ide,C++,C,Arduino Ide,我正在编写一个小代码,以便在传感器读数高于某个阈值时启用蜂鸣器。为了启用蜂鸣器一秒钟,我通过调用此函数给出了1000毫秒的延迟:delay(1000)。但是,我随机输入了delay+(1000),它编译得很好。这个函数调用语法正确吗 我已经在ArduinoIDE上尝试过这段代码。它可以编译,但对于avr gcc或avr-g++或gcc/g++,情况并非如此 我希望delay+(1000)不会编译,因为它似乎不是有效的c/c++语法 更新1: 使用Arduino IDE编译并将以下代码段上载到Ar
delay(1000)
。但是,我随机输入了delay+(1000)
,它编译得很好。这个函数调用语法正确吗
我已经在ArduinoIDE上尝试过这段代码。它可以编译,但对于avr gcc或avr-g++或gcc/g++,情况并非如此
我希望delay+(1000)不会编译,因为它似乎不是有效的c/c++语法
更新1:
使用Arduino IDE编译并将以下代码段上载到Arduino UNO:
void setup()
{
Serial.begin(9600);
}
void loop()
{
int x = delay+(1000);
Serial.println(x);
}
它会毫不延迟地连续打印随机数1132。(那么,1132=>函数指针地址+100?)
我还观察到delay+(1000)
和delay-(1000)
编译,但delay*(1000)
和delay/(1000)
的情况并非如此。编译器出现以下错误:
草图:8:错误:“void(long unsigned int)”和>“int”类型的操作数对二进制“operator*”无效
delay*(1000);
^
然而,这个intt=(int)延迟*(1000)代码>编译得很好
更新2:
根据下面的答案,delay(x)
只执行函数指针算法(使用一元或二元运算符),而不执行函数本身
我使用了以下代码段:
void setup()
{
Serial.begin(9600);
}
int custom()
{
Serial.println("hello");
return 0;
}
void loop()
{
custom+(1000);
delay+(1000);
}
它编译得很好,没有输出任何东西
更新3:
我在ArduinoIDE的首选项下将编译器警告级别更改为“全部”。在编译这段代码时
void setup()
{
delay+(1000);
}
void loop() {}
获得以下警告:
草图_jun09a.ino:在函数“void setup()”中:
草图_jun09a.ino:3:14:警告:指向算术中使用的函数的指针[-Wpointer arith]
delay+(1000);
^
草图_jun09a.ino:3:8:警告:语句无效[-Wunused值]
delay+(1000);
^
我认为它将1000
添加到函数指针、变量、常量或宏扩展delay
中,但是表达式delay+(1000)
本身没有多大作用…因此这里有两件事
delay+(1000)
是向函数指针延迟添加1000的语法。这当然是完全没有意义的,但它为什么要编译呢。通常,您可以向指针添加整数,但这不适用于void*
指针和函数指针gcc
但是有一个扩展,使得添加到void*
和void(*)(
的操作通过提供类型void
和void()
大小1来实现。因此,将整数添加到函数中是有效的(无用的)
事实证明,向void*
指针中添加整数有时是您真正想要做的事情,并且扩展消除了一些恼人的额外局部变量,但函数指针几乎从来没有这样工作过。我猜不久前有人在构建asm代码,因为这是我能想象到的唯一用例。提示:在某些体系结构上,函数指针不是指向函数代码,而是指向描述符。看看Joshua的答案,了解原因。这是一个很好的答案。至于怎么做,您需要实际调用delay
void setup()
{
Serial.begin(9600);
}
void loop()
{
delay(1000);
Serial.println("Hi there");
}
它看起来像是在做指针算术,将1000
添加到delay
,然后丢弃结果(除非您将其分配给某个对象)。我不知道为什么它允许这样做,我无法想象它是如何有用的。标准C和标准C++都不允许函数指针运算。然而,GCC似乎有一个扩展。您应该调整编译标志,直到这成为编译器错误。@chris:我给您提供了一些扩展的格言。@chris我认为在arduino IDE中没有简单的方法来调整编译标志。