Arduino Compiler Problem With #ifdefs Solved. - Sub-Etha Software
Maybe your like
In C, “#ifdef” or “#if defined()” are used to hide or include portions of code only if certain conditions are met. For example, my recent *ALL RAM* BBS experiment contains code for using the SD card library as well as the Ethernet library. I used #ifdef around specific blocks of code so I could compile versions with or without either of those libraries. But all is not well in Arduino land. Consider this following, simple example:
#if defined(FOO) byte mac[] = { 0x2A, 0xA0, 0xD8, 0xFC, 0x8B, 0xEE }; #endif void setup() { Serial.begin(9600); while(!Serial); Serial.println("Test..."); } void loop() { }This is supposed to only include the “byte mac[] =” line if “FOO” is defined, such as with: #define FOO However, on the current Arduino IDE (1.0.4), this simple code will fail with:
ifdef.ino: In function ‘void setup()’: ifdef:18: error: ‘Serial’ was not declared in this scope
What? Suddenly “Serial.println()” won’t work? Moving the byte declaration outside of the #if def make it work. Very weird.
I also found a similar example, where I tried to comment out a function that used SD library variable types:
void setup() { Serial.begin(9600); while(!Serial); Serial.println("Test..."); } void loop() { } #ifdef FOO byte fileReadln(File myFile, char *buffer, byte count) { } #endifIn this example, I did not want the fileReadln() function to be included unless I had defined FOO. But, compiling this produces:
ifdef:15: error: ‘File’ was not declared in this scope ifdef:15: error: expected primary-expression before ‘char’ ifdef:15: error: expected primary-expression before ‘count’ ifdef:15: error: initializer expression list treated as compound expression
Unhelpful. And after wasting some time on this, I started a topic in the Arduino.cc forums to ask if others were experiencing the same thing. And they were. A helpful post from parajew pointed me to this site which helped explain the problem, and offered a workaround:
The pre-processor does some stuff behind the scenes, creating prototypes and including header files where needed, and it just does it wrong. The A-Control site figured out a simple workaround, which I trimmed a bit to just adding this at the top of my scripts:
// BOF preprocessor bug prevent - insert me on top of your arduino-code // From: http://www.a-control.de/arduino-fehler/?lang=en #if 1 __asm volatile ("nop"); #endif…and now either of my examples will compile as intended. Thank you, parajew and A-Control! I can now move on to my next problem…
Hope it helps you, too.
Share this:
- X
- Telegram
Like this:
Loading...Related
Tag » Arduino Ifndef Not Working
-
IDE - Ignoring '#ifndef' Directive - Arduino Forum
-
Arduino #ifndef Compiler Directive Issues - Programming Questions
-
Does #ifdef / #if Defined() Not Work On Arduino IDE?
-
Ifdef Does Not Work At All On Due - Arduino Forum
-
Ifdef Doesn't Seem To Be Working - Arduino Forum
-
Ifndef Causing Compile Problems - Arduino Forum
-
Why Wont These 2 Lines Of Code Work Inside My #ifdef/#endif
-
Ifdef Does Not Compile, // Does - Arduino Forum
-
[SOLVED] #ifndef Not Working? - AVR Freaks
-
How Do I Avoid The "multiple Definition Of ..." Error In This Case
-
Arduino Preprocessor Directives Tutorial - Ifdef & Endif - Device Plus
-
How To Properly Hardcode Compiler's Define Flag - Stack Overflow
-
Ifndef Not Working For RX2/TX2 Redefinition · Issue #4583 - GitHub
-
Problems With Library, #include And #ifdef - PlatformIO Community