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

问题描述 投票:0回答:1

我有一个现有的AVR程序使用main函数,而不是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. 如果这是按预期工作,那么最好的替代方案是什么?

我的理解(忽略模板类)是有一个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.
c++ arduino
1个回答
0
投票
  1. 你不应该定义自己的main()函数。
  2. 添加void loop()void setup()函数
  3. 您想要放在main()函数中的代码应分为两部分: 初始化代码应放入setup(), 和“主循环”代码 - 进入loop()函数。

并且您的代码可以使用或不使用static关键字进行编译。

© www.soinside.com 2019 - 2024. All rights reserved.