Re: [dev] dwm alpha patch: const isn't a const??

From: Michael Forney <mforney_AT_mforney.org>
Date: Sun, 26 May 2019 01:39:18 -0700

On 2019-05-26, Paul Swanson <psw_AT_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 };`.
Received on Sun May 26 2019 - 10:39:18 CEST

This archive was generated by hypermail 2.3.0 : Sun May 26 2019 - 10:48:08 CEST