【问题标题】:How does this compile in Arduino IDE?这如何在 Arduino IDE 中编译?
【发布时间】:2021-01-12 21:02:51
【问题描述】:

我注意到以下代码,显然是无效的 C++,在 Arduino IDE 中编译(使用 AVR-GCC):

// The program compiles even when the following
// line is commented.
// void someRandomFunction();


void setup() {
  // put your setup code here, to run once:
  someRandomFunction();
}

void loop() {
  // put your main code here, to run repeatedly:

}

void someRandomFunction() {
}

这里发生了什么? C++ 要求在使用函数之前声明它们。当编译器来到setup()函数中的someRandomFunction()这一行时,它怎么知道它会被声明?

【问题讨论】:

  • 不知道。可能你正在编译为 C 代码?
  • Arduino C++ 更像是 C++ 的一种方言,实际上是“C++”。尽管如此,I cannot reproduce。您使用的是哪个版本?有哪些编译器选项?
  • 要添加到@AdrianMole 的评论中,该程序所在的文件的名称是什么? C accepts it with warnings
  • Arduino“草图”和许多库在很大程度上是一个非常臃肿和愚蠢的 C++ 变体,仅适用于那些避免阅读和学习,只喜欢复制和粘贴的修补匠和学生。如果您想为大多数这些嵌入式设备创建真正的软件,请放弃 .INO 并使用汇编或 C 编写。避免动态分配。
  • 正如@Shuyna 所暗示的那样,幕后发生了很多事情。您的 *ino 文件会被预处理,并且会自动为您创建函数声明。这就是为什么我们不必在使用之前声明函数的原因。它还调用标准avr-gcc 来编译您的程序、链接库并创建用于上传的十六进制文件。一键完成。在首选项中,在编译期间打开详细输出,您将看到一切正常。有些人对它有真正的仇恨;对我来说,这是一个完成工作的简单工具。 (自 1981 年开始编写 C)。

标签: c++ arduino avr-gcc


【解决方案1】:

这就是我们所说的前向声明,在 C++ 中,它只需要您在尝试使用它之前声明函数的原型,而不是定义整个函数。:

以下面两段代码为例:

代码 A:

#include <Arduino.h>
void setup(){}
void AA(){
  // any code here
}
void loop(){
  AA();
}

代码 B:

#include <Arduino.h>
void setup(){}
void loop(){
  BB();
}
void BB(){
  // any code here
}

严格来说,C 要求函数被前向声明以便编译器编译和链接它们。所以在 CODE A 中,我们没有声明函数,而是定义了它,这使得它对于正确的 C 代码是合法的。但是 CODE B 在循环之后有函数定义,这对于普通 C 是非法的。解决方案如下:

#include <Arduino.h>

void BB();

void setup(){}
void loop(){
  BB();
}
void BB(){
  // any code here
}

然而,为了适应 Arduino 脚本格式,即在 void loop() 之后有一个 void setup(),需要 Arduino 在其 IDE 中包含一个脚本,该脚本会自动查找函数并为您生成原型,因此您无需担心。因此,尽管是用 C++ 编写的,但您不会经常在草图中看到使用前向声明的 Arduino 草图,因为它工作得很好,而且通常更容易阅读具有第一个 setup() 和 loop()。

【讨论】:

    【解决方案2】:

    您的文件是 .ino 而不是 .cpp。 .ino 是“Arduino 语言”。

    带有附加 ino 文件 are processed by the Arduino builder 的主 ino 文件到 C++ 源代码,然后才作为 C++ 处理(预处理器,编译)。

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 2021-10-22
      • 2022-07-16
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 2012-06-01
      相关资源
      最近更新 更多