Hello. I am trying to find new and exciting ways to optimize (read: shrink down) my current code and want to include an eeprom autorefresh option to cut down on variables. Basically, when I have the AutoRefreshCompile option set, I want it to create the variable "randomvariable". My code is pretty simple:
#define AutoRefreshCompile 1 #if(AutoRefreshCompile==1) { // line x extern signed short randomvariable; } // line y #endif
I am getting errors that read as follows:
VARS.H(x) error C141: syntax error near '{' VARS.H(y) error C141: syntax error near '}'
I'm guessing it is not possible to do this (if I remember correctly, variables have to be declared at the beginning and can't be in the middle of functions/code segments but maybe it's some really simple fix.
I realize this might not work but I figure it's worth a shot. Any suggestions? Thanks!
optimize (read: shrink down) my current code and want to include an eeprom autorefresh option to cut down on variables
So how did you figure adding stuff whould shrink down your current code?
Hans, I ADDED preprocessor statements to REMOVE parts of code that are not always needed by setting a bit. Where did I lose you?
And as far as the previous suggestions go, you are 100% correct and brackets are not allowed in vars statements so it was a straight forward issue (and, as suggested, you are correct, I was lacking information). I now understand a bit better the limitations of what you can or cannot place in those files. I appreciate all the help! This should be the last little piece to further optimize. Thanks again for all your help!
That doesn't actually make sense.
I think you may still need to take some more time to too fully get to grips with the meaning of braces (aka "curly brackets"), and where they are allowed...?
John Doe Posted (why not the real name)
The file name VARS.H implies it is a header file. Header files should not contain code, so your snippet:
Erik
I think I had a fundamental understanding problem when I assumed:
#if(AutoRefreshCompile==1) { dofunction(variable); } #endif
was exactly the same as this:
#if(AutoRefreshCompile==1) dofunction(variable); #endif
In theory, it does the same thing (at least to my knowledge, which I'm starting to question) but apparently, the brackets themselves cause a change in the way it's read by the compiler, which causes an issue in .H files.
Any chance someone has a link or can explain to me why the brackets change things in this situation? (it looks like I had a similar misunderstanding in this thread: http://www.keil.com/forum/21544/).
without any # stuff I added brackets around void foo(void);
and got errors
it is just the brackets NOT the brackets and #
You are STILL confoosing precompiler conditions and compiler conditions. Compiler conditions can (in my opinion must) use brackets, precompiler condditionals do and can not (yes there is an exception to "can not" but I will not get into that it will just confuse the issue)
So if I understand what you're saying, "if" statements need brackets if they are multiple lines long to show when a conditional statement begins and ends but, because precompiler conditionals (like "#if")have a #endif to show where they end, there is no need for brackets? I believe this is what you're saying and, if so, this makes perfect sense to me.
Is this correct or have I missed something?
Yes, of course they do!
The braces are syntactically significant in the 'C' programming language.
eg,
if( condition ) a; b;
is not the same as
if( condition ) { a; b; }
is it?
You need to take care to distinguish between statements and preprocessor directives.
preprocessor directives are easily distinguished by the fact that they begin with a '#'
Braces group a number of statements into a compound statement or block - they have nothing to do with preprocessor directives.
This is standard textbook stuff - nothing specifically to do with Keil.
View all questions in Keil forum