Wide-string Functions: Double Casting

Eric Pouech eric.pouech at wanadoo.fr
Tue Aug 8 14:27:23 CDT 2006


Andrew Talbot wrote:

>David Laight wrote:
>
>  
>
>>On Mon, Aug 07, 2006 at 09:54:20PM +0100, Andrew Talbot wrote:
>>    
>>
>>>would like to submit a patch that, for example, changes strchrW() to:
>>>
>>>extern inline WCHAR *strrchrW( const WCHAR *str, WCHAR ch )
>>>{
>>>    WCHAR *ret = NULL;
>>>    do { if (*str == ch) ret = (WCHAR *)(size_t)str; } while (*str++);
>>>    return ret;
>>>}
>>>      
>>>
>>why not just have:
>>
>>extern inline void *__deconst(const void *v)
>>{
>>return (char *)0 + ((const char *)v - (const char *)0));
>>}
>>
>>Then the code above could be:
>>extern inline WCHAR *strrchrW( const WCHAR *str, WCHAR ch )
>>{
>>do { if (*str == ch) return __deconst(str); } while (*str++);
>>return 0;
>>}
>>
>>David
>>
>>    
>>
>
>That's interesting. IMHO, it's a bit more complex and obscure, but seems to
>ensure portability. I shall be interested to know what others think.
>
>  
>
what I don't like is that in order to plug a hole (casting from const 
foo* to foo*), we create a bigger hole by allowing to cast from const 
foo* to bar* (and the compiler will not give any warning)
if we want to go into this, then I'd rather have _deconst explicitly use 
the type:
#define __deconst(v,X)    ({const X _v = (v); ((X)(int)_v);})
and in the previous example use __deconst(str, char*);

one could think of using gcc's typeof operator to avoid passing the type 
to deconst, but this doesn't seem possible (you have to express foo* in 
terms of const foo* which isn't possible AFAICT)

A+




More information about the wine-devel mailing list