【问题标题】:Does C++ for arduino follow the standard?arduino 的 C++ 是否遵循标准?
【发布时间】:2020-10-28 21:17:06
【问题描述】:

Arduino平台上的C++程序没有其他平台上的main()函数;相反,它必须有两个名为setup()loop() 的函数。但根据 C++ 标准 - 所有 C++ 程序都必须有一个 main() 函数。

那么,这样的 C++ 代码是否符合标准? Arduino 上的 C++ 编译器/链接器/加载器是否符合标准?

【问题讨论】:

  • 确实有一个main 函数,只是不在你的代码中。
  • 语法元素可以,标准库不行。
  • 它是否可能具有调用setuploop 的“内置”(和隐藏)main 函数?
  • 您不必在每个编译单元中都有main()
  • @FrançoisAndrieux:请看答案。它可能不是不合规的。

标签: c++ main arduino-c++ freestanding


【解决方案1】:

C++ 标准提供两种执行环境:独立式和托管式。这里的大多数人都在托管环境中运行,您的程序从main() 开始。嵌入式系统在独立环境中运行,程序启动是通过实现定义的机制进行的。独立环境的编译器可以省略标准库的某些部分。更多详情,see here

所以,setup()loop() 在独立环境中是可以的。不需要main()。不知道Arduino的库是否符合标准中的要求。

在托管环境中,通常有一个操作系统(主机)可以让您启动程序。这种环境的 C++ 程序必须有main()。在独立环境中,程序通常在设备打开时启动。这更接近于金属,并且允许系统有自己的要求,以简化启动应用程序的样板代码。

【讨论】:

  • 如果您想在其中包含标准文本,不值得我添加新答案:timsong-cpp.github.io/cppwp/basic.start.main#1.sentence-3
  • 它不提供标准。你甚至不能new 一个对象。您可以通过添加到应用程序源代码来导入部分实现。
  • 还添加了标准文本的链接,希望没问题。
  • @cigien — 我回滚了你的添加。这只是标准关于独立环境的措辞的一小部分。它解决了main(),但不是库要求。
  • 这很公平。我还是觉得关于main的标准文字,关于库需求的文字应该加到答案里。仅仅为语言律师问题链接到 cppreference 对我来说并不合适:p
【解决方案2】:

在这里大声说出来:一个main.cpp,大致如下:

#include <Arduino.h>

int main(void) {
  init();
  setup();
  for (;;) {
    loop();
  }
  return 0;
}

Arduino IDE 提供它。它还会生成函数原型(如果它们尚不存在),并执行一些其他操作。

因此,在 Arduino IDE 的可见代码中没有 main() 并不意味着它不存在,或者它违反了标准。

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多