
Hi Graeme,
Hi Wolfgang
On Wed, Nov 9, 2011 at 9:49 AM, Wolfgang Denk wd@denx.de wrote:
Dear Simon Glass,
In message CAPnjgZ15f_gva5+MM1Em-L2sMxt1WAATxqiKUHOQAT893t9MMw@mail.gmail.com you wrote:
This discussion was regarding the need to #ifdef the variable declaration, viz:
#if defined(THING1) || defined(THING2) const char *cat; #endif
...
#ifdef THING1 cat = getenv("cat");
send_back(cat); #endif
....
#ifdef THING2 cat = check_outside("cat");
if (cat) wibble(cat); #endif
and whether the top bit would be better as:
__maybe_unused const char *cat;
But more generally, lots of #ifdefs do make the code harder to read, and potentially more brittle in the face of config changes.
I would like to see only a minimal number of "__maybe_unused" in the code - in cases, where this is the way that hurts least.
In the examples above, it might be better to use local blocks, like:
#ifdef THING1 { const char *cat = getenv("cat");
send_back(cat); }
#endif
I honestly think most of these cases can be factored out into functions. The compiler should inline them anyway so the overhead should be zero. The various board.c files are a prime example of where this should be done as a matter of principle to reduce the complexity and lenght of the primary function anyway
I would even like to skip the ifdefs completely. Modern compilers with dead code elimination will completely do away unneeded code _but still do syntax checks on the parts every time_.
So maybe we should simply try to use
if (THING1) { ... }
I know that this would need an "#ifdef THING1 1" but errors in this would be caught immediately (and not only under a certain combination of ifdefs) by the compiler so I don't think this is a problem.
I don't know how often I repeat my mantra, but every ifdef doubles the number of _different source codes_ that we deal with.
Cheers Detlev