如何使用c++ 11对Arduino进行编程?

How can I use a C++11 to program the Arduino?

本文关键字:编程 Arduino 何使用 c++      更新时间:2023-10-16

如何在编程Arduino时使用c++ 11 ?

我可以使用Arduino IDE或其他环境。我最感兴趣的是核心语言的改进,而不是需要改变标准库的东西。

1.6.6版本开始,Arduino IDE默认启用c++ 11。

旧版本,请继续阅读:

可以很容易地更改工具链中任何元素的标志,包括汇编器、编译器、链接器或存档器。

在Arduino IDE 1.5.7版本(2014年7月发布)上测试,

  1. 找到platform.txt文件,
  • AVR架构=>{安装路径} arduino avr硬件 platform.txt
  • SAM架构=>{安装路径}硬件 arduino 山姆 platform.txt
在该文件中,您可以更改任何标志,例如
  • compiler.c。flags用于更改c++文件的默认编译标志。
  • compiler.cpp。flags用于更改c++文件的默认编译标志。
  • 您还可以更改任何"食谱"。或编译模式,在配置文件的相应部分,标题为"AVR/SAM编译模式"。
  • 修改后,必须重启Arduino IDE,至少在1.5.7版本。例如,

    要启用对c++ 11 (c++ 0x)的支持,在Arduino IDE版本1.5.7和1.5.8上测试,您只需添加标志"-std=gnu++11"在以compiler.cpp.flags=".

    开头的行末尾

    预计在不久的将来在Arduino IDE上默认启用c++ 11 。然而,在1.5.8版本(2014年10月),情况仍然不是这样。

  • Arduino IDE 1.6.6及更新版本默认启用c++ 11(它们在platform.txt文件中设置了编译器标志"-std=gnu++11")。

    首先,只有GCC 4.7及以上版本(因此只有AVR-GCC 4.7及以上版本)支持c++ 11。因此,检查安装的版本:

    gcc --version
    avr-gcc --version
    

    如果AVR-GCC是4.7或更高版本,那么你可以使用c++ 11。

    Arduino IDE不支持自定义编译器标志。这已被请求,但尚未实现。

    因此,您只能使用其他环境,或者直接从命令行编译您的程序。

    在使用AVR-GCC直接从命令行编译的情况下,您只需要添加一个额外的编译器标志来启用c++ 11支持。

    -std=c++11
    

    对于特定的开发环境,大多数将支持从IDE中的构建选项编辑编译器标志。上面提到的标志需要添加到每个环境的标志列表中。


    c++ 0x是c++ 11标准工作草案的名称。c++ 0x支持从GCC 4.3开始。但是,这是严格的实验性支持,因此您不能可靠地期望提供c++ 11特性。以下是相应版本的GCC提供的完整功能列表。AVR-GCC中的可用特性将与相应GCC版本中的可用特性相同。

    c++ 0x的编译器标志是:

    -std=c++0x
    

    请注意,没有简单的方法可以从Arduino IDE或使用其他IDE (Eclipse, Code::Blocks等)或命令行指定额外的标志。

    作为一个hack,你可以使用一个小代理程序(应该是跨平台的):

    //============================================================================
    // Name        : gcc-proxy.cpp
    // Copyright   : Use as you want
    // Description : Based on http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp
    //============================================================================
    #include <unistd.h>
    #include <iostream>
    #include <vector>
    #include <fstream>
    using namespace std;
    int main(int argc, char *argv[]) {
        vector<string> arguments;
        vector<const char*> aptrs;
        // Additional options, one per line
        ifstream cfg((string(argv[0]) + ".ini").c_str());
        if (cfg.bad())
            cerr << "Could not open ini file (you're using proxy for some reason, er?)" << endl;
        string arg;
        while (cfg) {
            getline(cfg, arg);
            if(arg == "r" || arg == "n")
                continue;
            arguments.push_back(arg);
        }
        for (const string& arg : arguments)
            aptrs.push_back(arg.c_str());
        for (int i = 1; i < argc; ++i)
            aptrs.push_back(argv[i]);
        // Add null pointer at the end, execvp expects NULL as last element
        aptrs.push_back(nullptr);
        // Pass the vector's internal array to execvp
        const char **command = &aptrs[0];
        return execvp(command[0], command);
    }
    
    1. 将原来的avr-g++.exe重命名为avr-g++. origin .exe(或任何其他名称)。
    2. 创建avr-g++.ini文件,其中第一行是原始程序的完整路径(例如D:Arduinohardwaretoolsavrbinavr-g++. origin .exe),并根据需要添加额外的参数,每行一个。

    你完成!

    <

    例子em> avr-g + + . ini :

    D:Arduinohardwaretoolsavrbinavr-g++.orig.exe
    -std=c++0x
    

    我使用Ino,这是有效的:

    ino build -cppflags="-std=c++0x"
    

    这生成了一个十六进制文件的大小至少为15k(这是在优化打开的情况下),而标准构建的大小约为5k,这是可怜的小ATmega328的考虑因素。对于具有更多程序空间的微控制器之一,这可能是可以的。

    如果您需要更多的控制和更好的IDE,我建议使用Sloeber Plugin for Eclipse或Sloeber IDE本身。

    使用这个IDE创建更复杂的代码要容易得多。它还允许向编译器(C, c++和链接器)添加标志。因此,要自定义编译,只需右键单击project并选择Properties。在Properties窗口中,选择Arduino→Compiler Option。这样,您就可以在构建中添加选项。