At 2018-05-05T11:51:00+0100, Keith Marshall wrote:
> On 05/05/18 10:48, G. Branden Robinson wrote:
> > (Incidentally, I share your preference for putting type qualifiers
> > [as opposed to storage classes] _after_ the type name itself.  It
> > makes complex declarations easier to understand.)
> 
> Personally, I consider that to be a poor choice ... especially if you
> are making it on purely stylistic grounds; conventionally:
> 
>   const int foo;
> 
> is more common than:
> 
>   int const foo;

Yes, it's more common.  And ill-advised.

> but that's not the real issue.  In practice, the placement of "const"
> qualifiers is *not* arbitrary;

That's true.  It largely follows from the English practice of placing
adjectives before nouns.  That's good comment style but risky C style.

> far from "making the declaration easier to understand", it can effect
> a subtle change in meaning.

Indeed.

> For example,
> in C code, it is very common to see:
> 
>   const char *foo;
> 
> which means something very different from:
> 
>   char const *foo;

Actually, it doesn't.  Try it.

> Your stylistic preference might encourage the latter idiom, but it
> likely isn't what you meant.  (The former declares a mutable pointer to
> an immutable C-string; the latter is an immutable pointer to a mutable
> C-string).

Experiment with the attached program.

-- 
Regards,
Branden
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int i = 1;
    int * ip = &i;
    int * const ipc = &i;
    int const * icp = &i;
    int const * const icpc = &i;

    icp = ip;
    // Uncomment to attempt assignment to read-only values.
    //ipc = ip;
    //*icp = 2;
    //icpc = ip;

    printf("i = %i; ip = %p; ipc = %p; icp = %p; icpc = %p\n", i, ip, ipc, icp,
            icpc);
    exit(EXIT_SUCCESS);
}

// vim:set cin et sw=4 ts=4 tw=80:

Attachment: signature.asc
Description: PGP signature

Reply via email to