gpt4 book ai didi

c++ - 这个函数调用 "delay+(1000)"在语法上是否正确?

转载 作者:太空狗 更新时间:2023-10-29 19:56:02 29 4
gpt4 key购买 nike

我正在编写一个小代码,以便在传感器读数高于特定阈值时启用蜂鸣器。为了使蜂鸣器持续一秒钟,我通过调用此函数延迟了 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 的首选项下将编译器警告级别更改为“全部”。在编译这段代码时,

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);
^

最佳答案

所以这里发生了两件事。

delay+(1000)

是将函数指针延迟加 1000 的语法。这当然是完全没有意义的,但它为什么要编译呢。通常您可以将整数添加到指针,但这不适用于 void *指针和函数指针。 gcc但是有一个扩展可以添加到 void *void(*)()通过给出类型来工作 voidvoid()大小 1。因此,向函数添加整数是有效的(无用)。

事实证明,将整数加到void *指针偶尔是你真正想做的事情,扩展摆脱了一些烦人的额外局部变量,但函数指针几乎从来没有像那样工作过。我猜有人刚才正在构建 asm 代码,因为这是我能想象的唯一用例。提示:在某些架构上,函数指针不指向函数代码而是指向描述符。

关于c++ - 这个函数调用 "delay+(1000)"在语法上是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56511761/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com