簡體   English   中英

Arduino:類的方法和主要功能中的靜態StringObject

[英]Arduino: static StringObject in class' method and main function

我有一個使用main功能而不是setuploop AVR現有程序。 這似乎是必需的,因為它使用了計時器,當我用setuploop手動替換它時,它不起作用。

這工作正常,但我想從庫中包含一些代碼,現在編譯器抱怨main多個定義。 這很奇怪,因為實際上沒有包含任何東西,而且我聲明了自己的main (因此沒有偷偷摸摸的默認main函數),並且我已經隔離到以下情況:

int main()
{

}

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

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

一旦在bar方法中聲明String foo ,編譯器便開始抱怨。 但僅當它聲明為static 否則,代碼將編譯。

我不是cpp ,無法弄清楚為什么在方法內部聲明靜態變量會觸發此事件。

  • 對於其他數據類型(僅從WString.h嗎?),( WString.h 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.
  1. 您不應該定義自己的main()函數。

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

  3. 您要放置在main()函數中的代碼應分為兩部分:

    • 初始化代碼應放在setup()
    • 和“主循環”代碼-放入loop()函數。

使用或不使用static關鍵字,您的代碼都可以愉快地編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM