Re: [AD] Update on `const'

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


In reply to Hein Zelle <hein@xxxxxxxxxx>:

[snip - just use `const']
>Even if this is true, is it worth converting back to 'const'? The fact
>that we switched in the first place means that preprocessor trickery
>with 'const' is not too easy, and using AL_CONST makes it almost
>trivial. What's the gain?

Well, what about if I wrote:

#define INTEGER int

and used that everywhere. It would soon get very annoying, especially if
somebody else was reading/copying my code. I just think it would be
better to use the proper `const' keyword rather than use the roundabout
AL_CONST macro.

>> char* get_filename(char* path);
>> const char* get_filename_const(const char* path);
>
>Ugh? what's wrong with 
>
>char *get_foo(char const * path); ?

Its semantics are totally wrong: it takes a pointer to constant data,
and returns a pointer to mutable data. Consider a situation where that
constant data is actually stored in ROM, but somebody thinks s/he can
write to it. More likely, the compiler optimises some surrounding code
on the assumption that the string won't be changed, when in fact it
will.

>It means (AFAIK) exactly what you say: the parameter is not altered,
>and the return value may be altered.

No, it means that the parameter is readonly, but that we return a
writeable pointer into readonly memory (which is plain wrong).

>In C++ the function probably wouldn't compile as it is now,
>since it assigns a const string to a non-const pointer.

This issue has nothing to do with C vs C++.

>I think in this case we should just make the return value of
>get_filename be const.

Great! Except this case:

{
  char buf[1000];
  file_select_ex("Message", buf, sizeof(buf), 0, 0);
  *get_filename(buf) = 0; // this is valid C++, don't know about C
}

  The function call is valid (it is OK to pass a `char*' to a function
  expecting a `const char*'), but the assignment is not.

> Are there any examples where it is really
>useful to split this up in 2 functions? It seems awkward to me.

The above example needs a prototype:

  char* get_filename(char*);

but there are situations (often, though not always, when dealing with
C++ strings) where you want to use a `const' pointer. This is needed
when dealing with ROM, and nice when dealing with compiler
optimisations.

Bye for now,
-- 
Laurence Withers, lwithers@xxxxxxxxxx
                http://www.lwithers.demon.co.uk/

Attachment: signature.asc
Description: PGP signature



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/