On 2019-05-26, Paul Swanson <p...@protonmail.com> wrote: > Hello, > > I've a fresh clone of dwm and the dwm alpha patch (20180613-b69c870) and > it's generating > the following error: > > dwm.c > In file included from dwm.c:280:0: > config.h:24:27: error: initializer element is not constant > [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, > ^~~~~~~~ > config.h:24:27: note: (near initialization for ‘alphas[0][1]’) > config.h:24:37: error: initializer element is not constant > > What I can't understand, is the fact that 'baralpha', and all the other > variables > accused of not being constants are in fact declared as "static const > unsigned int": > > static const unsigned int baralpha = 0xd0; > static const unsigned int borderalpha = OPAQUE; > > If I substitute the initialising variables for a numeric literal (ie. 1) it > compiles. > But if I leave the constants from the patch or make my own, it fails. > > How can a const, not be a const? > > Any help would be greatly appreciated.
I'm not familiar with the alpha patch, but in standard C, initializer elements need to be constant expressions, which is different from an identifier for a const-qualified object. See http://port70.net/~nsz/c/c99/n1256.html#6.6p7 for what is allowed in initializers for static objects. Perhaps the author of the patch was using a compiler that allows these initializers (it looks like gcc-8 does, but gcc-7 does not). If you want a portable way to use an identifier in an initializer for a global, you have to use a preprocessor define like `#define baralpha 0xd0`, or enum constant like `enum { baralpha = 0xd0 };`.