Arduino:类'方法和主函数中的静态StringObject

时间:2017-12-23 14:18:17

标签: c++ arduino

我有一个使用main功能的AVR现有程序,而不是setuploop。这似乎是需要的,因为它使用了计时器,当我用setuploop手动替换它时,它不起作用。

这很好但我想从库中包含一些代码,现在编译器抱怨main的多个定义。这很奇怪,因为没有真正包括在内,我声明了我自己的main(所以没有偷偷摸摸的默认main函数)并且我已经孤立到以下情况:

int main()
{

}

// Foo.h
class Foo
{
  void bar();
};

// Foo.cpp
void Foo::bar()
{
  /* remove static here */
  static String foo;
}

一旦我在String方法中声明foo bar,编译器就会开始抱怨。但只有当它被声明为static时。否则代码会编译。

我不是cpp人,也无法弄清楚为什么在方法中声明静态变量会触发这个。

  • 只有String(来自WString.h?)的其他数据类型(我可以找到)才会发生。
  • 明确包括WString时没有任何变化。


  1. 这是Arduino框架中的错误吗?或者我错过了一些明显的东西?
  2. 如果这是按预期工作的,最佳选择是什么?
  3. 我的理解(忽略模板类)是foo的单一副本;所以我可以全局声明它或作为类的成员变量(后者在技术上是不同的,但只有这个类的单个实例)。

    我得到的错误:

    // previous stages succeed
    ...
    Linking everything together...
    "/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-gcc" -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p  -o "/path/to/build/static_in_cpp_method.ino.elf" "/path/to/build/sketch/static_in_cpp_method.ino.cpp.o" "/path/to/build/../arduino_cache_993247/core/core_arduino_avr_pro_cpu_16MHzatmega328_51f02b7210b938436b779d1c032618e1.a" "-L/path/to/build" -lm
    main.cpp.o (symbol from plugin): In function `atexit':
    (.text+0x0): multiple definition of `main'
    /path/to/build/sketch/static_in_cpp_method.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
    collect2: error: ld returned 1 exit status
    exit status 1
    Error compiling for board Arduino Pro or Pro Mini.
    

1 个答案:

答案 0 :(得分:0)

  1. 您不应该定义自己的main()功能。

  2. 添加void loop()void setup()函数

  3. 您想要放在main()函数中的代码应分为两部分:

    • 初始化代码应放在setup()
    • 和"主循环"代码 - 进入loop()函数。
  4. 您的代码可以使用或不使用static关键字进行编译。