C++ 这是函数调用吗;延迟+;(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

我正在编写一个小代码,以便在传感器读数高于某个阈值时启用蜂鸣器。为了启用蜂鸣器一秒钟,我通过调用此函数给出了1000毫秒的延迟:
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中没有简单的方法来调整编译标志。