2013-10-21 41 views
2

我發現,剛工作正常Ç而造成(在Windows上)在有條件的宏定義變量提供錯誤

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

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

的Arduino的問題,這個代碼只是正常工作的問題。但是,如果我改變

#define NO_PROBLEM 

//#define NO_PROBLEM 

編譯器會出現以下錯誤返回:

core.a(main.cpp.o): In function main: C:\Users\user\arduino-1.0.4-windows\arduino-1.0.4\hardware\arduino\cores\arduino/main.cpp:5: undefined reference to setup C:\Users\user\arduino-1.0.4-windows\arduino-1.0.4\hardware\arduino\cores\arduino/main.cpp:15: undefined reference to loop

這是一些調試宏的一部分,我想有些變量在那裏只在DEBUG模式下,所以實際上NO_PROBLEM在我的代碼中是DEBUG。

+0

然後將使用這些變量的每一行都包裝到一個'#ifdef ...#endif'中。 – 2013-10-21 17:39:30

+0

Hi @ H2CO3l。問題不在於我試圖在未定義的地方使用變量。我只是試圖在宏中使用它,像這樣在同一個地方定義。 #define DEBU' '#ifdef DEBUG char charBuf [16]; unsigned int numBuf; 的#define initDebug(){Serial.begin(115200);} 的#define debugPrint(消息){Serial.write(消息);} 的#define debugPrintInt(消息)\ {\ numBuf =消息; \ 串行.WRITE(itoa(numBuf,charBuf,10)); \} 的#else 的#define initDebug(){} 的#define debugPrint(消息){} 的#define debugPrintInt(消息){} #endif' –

回答

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() { 
} 

這編譯OK。

+0

謝謝你的幫助!這解釋了一些事情:) –