这个函数调用 "delay+(1000)" 在语法上是否正确?
Is this function call "delay+(1000)" syntactically correct?
我正在编写一个小代码以在传感器读数高于特定阈值时启用蜂鸣器。为了启用蜂鸣器一秒钟,我通过调用此函数延迟了 1000 毫秒:delay(1000)
。但是,我随机输入 delay+(1000)
并且编译得很好。这个函数调用在语法上是否正确?
我已经在 Arduino 上试过这段代码 IDE。它可以编译,但对于 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)
却不是这样。编译器给出以下错误:
sketch_jun09a:8: error: invalid operands of types 'void(long unsigned int)' and >'int' to binary 'operator*'
delay*(1000);
^
但是,这个 int t = (int)delay*(1000);
编译得很好。
更新 2:
根据下面的回答,delay<operator>(x)
只执行函数指针运算(使用一元或二元运算符)而不执行函数本身。
我使用了以下代码片段:
void setup()
{
Serial.begin(9600);
}
int custom()
{
Serial.println("hello");
return 0;
}
void loop()
{
custom+(1000);
delay+(1000);
}
它编译得很好,什么都不输出。
更新 3:
我在 Arduino IDE 的首选项下将编译器警告级别更改为 "ALL"。在编译这段代码时,
void setup()
{
delay+(1000);
}
void loop() {}
获得以下警告:
sketch_jun09a.ino: In function 'void setup()':
sketch_jun09a.ino:3:14: warning: pointer to a function used in arithmetic [-Wpointer-arith]
delay+(1000);
^
sketch_jun09a.ino:3:8: warning: statement has no effect [-Wunused-value]
delay+(1000);
^
我认为它将1000
添加到function pointer
、变量、常量或宏扩展 delay
但表达式 delay+(1000)
本身并没有做太多...
所以这里发生了两件事。
delay+(1000)
是函数指针延迟加1000的语法。这当然是完全没有意义的,但它为什么要编译呢。通常您可以将整数添加到指针,但这不适用于 void *
指针和函数指针。 gcc
然而有一个扩展,通过给类型 void
和 void()
大小 1 使添加到 void *
和 void(*)()
工作。因此,将整数添加到函数工作(没用)。
事实证明,将整数添加到 void *
指针偶尔是您真正想要做的事情,并且扩展摆脱了一些恼人的额外局部变量,但函数指针几乎从来没有那样工作过。我猜有人刚才正在构建 asm 代码,因为这是我能想象的唯一用例。提示:在某些架构上,函数指针不指向函数代码而是指向描述符。
查看 Joshua 的回答了解原因。这是一个很好的答案。至于做什么,你需要实际调用delay
.
void setup()
{
Serial.begin(9600);
}
void loop()
{
delay(1000);
Serial.println("Hi there");
}
我正在编写一个小代码以在传感器读数高于特定阈值时启用蜂鸣器。为了启用蜂鸣器一秒钟,我通过调用此函数延迟了 1000 毫秒:delay(1000)
。但是,我随机输入 delay+(1000)
并且编译得很好。这个函数调用在语法上是否正确?
我已经在 Arduino 上试过这段代码 IDE。它可以编译,但对于 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)
却不是这样。编译器给出以下错误:
sketch_jun09a:8: error: invalid operands of types 'void(long unsigned int)' and >'int' to binary 'operator*'
delay*(1000); ^
但是,这个 int t = (int)delay*(1000);
编译得很好。
更新 2:
根据下面的回答,delay<operator>(x)
只执行函数指针运算(使用一元或二元运算符)而不执行函数本身。
我使用了以下代码片段:
void setup()
{
Serial.begin(9600);
}
int custom()
{
Serial.println("hello");
return 0;
}
void loop()
{
custom+(1000);
delay+(1000);
}
它编译得很好,什么都不输出。
更新 3:
我在 Arduino IDE 的首选项下将编译器警告级别更改为 "ALL"。在编译这段代码时,
void setup()
{
delay+(1000);
}
void loop() {}
获得以下警告:
sketch_jun09a.ino: In function 'void setup()': sketch_jun09a.ino:3:14: warning: pointer to a function used in arithmetic [-Wpointer-arith]
delay+(1000); ^
sketch_jun09a.ino:3:8: warning: statement has no effect [-Wunused-value]
delay+(1000); ^
我认为它将1000
添加到function pointer
、变量、常量或宏扩展 delay
但表达式 delay+(1000)
本身并没有做太多...
所以这里发生了两件事。
delay+(1000)
是函数指针延迟加1000的语法。这当然是完全没有意义的,但它为什么要编译呢。通常您可以将整数添加到指针,但这不适用于 void *
指针和函数指针。 gcc
然而有一个扩展,通过给类型 void
和 void()
大小 1 使添加到 void *
和 void(*)()
工作。因此,将整数添加到函数工作(没用)。
事实证明,将整数添加到 void *
指针偶尔是您真正想要做的事情,并且扩展摆脱了一些恼人的额外局部变量,但函数指针几乎从来没有那样工作过。我猜有人刚才正在构建 asm 代码,因为这是我能想象的唯一用例。提示:在某些架构上,函数指针不指向函数代码而是指向描述符。
查看 Joshua 的回答了解原因。这是一个很好的答案。至于做什么,你需要实际调用delay
.
void setup()
{
Serial.begin(9600);
}
void loop()
{
delay(1000);
Serial.println("Hi there");
}