D2 toStringz Return Type

Steven Schveighoffer schveiguy at yahoo.com
Fri Nov 7 11:59:30 PST 2008


"Andrei Alexandrescu" wrote
> Steven Schveighoffer wrote:
>> "Andrei Alexandrescu" wrote
>>> Mike Parker wrote:
>>>> I'm curious as to why toStringz in D2 returns const(char)* instead of 
>>>> just a plain char*. Considering that the primary use case foe the 
>>>> function is interfacing with C code, it seems rather pointless to 
>>>> return a const(char)*.
>>> We want to leave the opportunity open to not duplicate the actual memory 
>>> underneath the string object. (Right now that opportunity is not 
>>> effected.)
>>
>> My recommendation -- have 2 functions.  One which always copies (and 
>> returns char *), and one which does not.
>>
>> This at least leaves a safe alternative for people who have headers that 
>> aren't properly constified, and don't want to go through the hassle of 
>> looking it up themselves.  Also good for those C functions which actually 
>> require a mutable char *, since D2 strings are mostly invariant.
>
> You can't quite do that because dynamic conditions establish whether it's 
> safe to avoid copying or not.

I can see how you interpreted it this way.

What I meant was one is the toStringz as it is today, which might copy and 
might leave it in-place.  This can be used to call C functions that take a 
const char *.  The other function will *always* copy, and will return a 
mutable char *.  This is for when you don't care to look at the function 
yourself (assuming the author got it correct), or the case where the C 
function actually does mutate the argument.

If the C function does actually require a mutable argument, you are forced 
to do an extra dup for no reason with today's toStringz.

-Steve 





More information about the Digitalmars-d mailing list