Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| From | Keith Thompson <Keith.S.Thompson+u@gmail.com> |
|---|---|
| Newsgroups | comp.std.c |
| Subject | Re: Can the new generic string functions accept void* arguments? |
| Date | 2023-06-04 21:37 -0700 |
| Organization | None to speak of |
| Message-ID | <87fs76jzir.fsf@nosuchdomain.example.com> (permalink) |
| References | <87fs7afpcw.fsf@nosuchdomain.example.com> <87bkhyfnm7.fsf@nosuchdomain.example.com> <87r0qttw7h.fsf@bsb.me.uk> |
Ben Bacarisse <ben.usenet@bsb.me.uk> writes:
> Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:
>> Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:
>>> The latest draft of the upcoming C23 standard is:
>>> https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf
>>> It introduces several type-generic functions in <string.h>, replacing
>>> normal functions of the same names: memchr, strchr, strpbrk, strrchr,
>>> strstr.
>>>
>>> I'll use strchr() as an example; the same applies to the other str*()
>>> generic functions (but not to memchr()).
>> [...]
>>
>> Just after I posted the above, I thought of a potential issue with
>> memchr() that just might affect real code.
>>
>> In C17 and earlier, memchr() has this declaration:
>>
>> void *memchr(const void *s, int c, size_t n);
>>
>> Given the implicit conversions between void* and other object pointer
>> types, the first argument can be a pointer to any const object type.
>> This is something that might plausibly be used in practice, unlike
>> (I think) passing a void pointer to the str*() functions.
>>
>> It's probably impractical to fix this, since it would require
>> the generic selection to cover all possible object pointer types.
>
> There may be a way round that... This trick converts any object pointer
> to a const void * or a void * depending on the qualifiers of the object
> pointer:
>
> #include <stdio.h>
>
> #ifndef T
> #define T const int
> #endif
>
> int main(void)
> {
> T i;
> puts(_Generic((1 ? &i : (void *)&(int){0}),
> void *: "void *",
> const void *: "const void *",
> default: "other"));
> }
>
> (Compile with -DT=int for example to test the other case.)
>
> Taking the address of (int){0} is simply a way to get a void * that is
> not a null pointer constant. One could, in a macro taking pointer, just
> use
>
> (1 ? (p) (void *)(p))
>
> but some compilers will warn that the cast discards the const even
> though the overall effect of the expression is to keep it.
I think you're right. I'll pass it on to the editors.
--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
Will write code for food.
void Void(void) { Void(); } /* The recursive call of the void */
Back to comp.std.c | Previous | Next — Previous in thread | Next in thread | Find similar
Can the new generic string functions accept void* arguments? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2023-06-01 21:41 -0700
Re: Can the new generic string functions accept void* arguments? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2023-06-01 22:18 -0700
Re: Can the new generic string functions accept void* arguments? Jakob Bohm <jb-usenet@wisemo.com.invalid> - 2023-06-02 15:03 +0200
Re: Can the new generic string functions accept void* arguments? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2023-06-02 11:52 -0700
Re: Can the new generic string functions accept void* arguments? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2023-06-02 22:01 +0100
Re: Can the new generic string functions accept void* arguments? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2023-06-04 21:37 -0700
Re: Can the new generic string functions accept void* arguments? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2023-06-04 21:50 -0700
Re: Can the new generic string functions accept void* arguments? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2023-06-02 15:11 -0700
csiph-web