2

Cでは正常に動作するが、Arduino (Windows) では問題を引き起こす問題を発見しました。

#define NO_PROBLEM
#ifdef NO_PROBLEM
  char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

このコードは問題なく動作します。でも私が変われば

#define NO_PROBLEM

//#define NO_PROBLEM

コンパイラは次のエラーを返します。

core.a(main.cpp.o): main 関数内: C:\Users\user\arduino-1.0.4-windows\arduino-1.0.4\hardware\arduino\cores\arduino/main.cpp:5:セットアップへの未定義の参照 C:\Users\user\arduino-1.0.4-windows\arduino-1.0.4\hardware\arduino\cores\arduino/main.cpp:15: ループへの未定義の参照

これはいくつかのデバッグ マクロの一部であり、いくつかの変数を DEBUG モードでのみ存在させたいので、実際には私のコードでは NO_PROBLEM は DEBUG です。

4

1 に答える 1

2

これは、プロトタイプ生成に関連して発生する IDE のバグです。IDE 設定を詳細なコンパイラ出力に変更します。ビルド ディレクトリを調べて、生成された .cpp ファイルを検索すると、次のように表示されます。

//#define NO_PROBLEM
#ifdef NO_PROBLEM
  #include "Arduino.h"
void setup();
void loop();
char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

対。

#define NO_PROBLEM
#ifdef NO_PROBLEM
  #include "Arduino.h"
void setup();
void loop();
char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

これは、コンパイラがコメントでコンパイルしない理由を説明しています。

回避策は、コンパイラによって最適化されて除去されるマクロ定義の前に、IDE が取得できるものがあることを確認することです。例えば

namespace trick17 {};
//#define NO_PROBLEM
#ifdef NO_PROBLEM
  char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

生成された .cpp ファイルは次のようになります

#include "Arduino.h"
void setup();
void loop();
namespace trick17 {};
//#define NO_PROBLEM
#ifdef NO_PROBLEM
  char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

そして、これは正常にコンパイルされます。

于 2013-10-23T21:07:33.727 に答える