Sujet : Re: question about nullptr
De : tr.17687 (at) *nospam* z991.linuxsc.com (Tim Rentsch)
Groupes : comp.lang.cDate : 13. Aug 2024, 02:10:44
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <86plqdz0q3.fsf@linuxsc.com>
References : 1 2 3 4 5 6 7 8 9 10 11 12 13 14
User-Agent : Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Keith Thompson <Keith.S.Thompson+
u@gmail.com> writes:
Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
>
Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:
>
Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
[...]
>
This posting has inspired me to try using (long)0.0
whenever a null pointer constant is needed. As for
example
>
(void*){ (long)0.0 }
>
as an argument to a variadic function where a pointer
is expected.
>
But surely ((void*)('/'/'/'-'/'/'/')) is more elegant.
>
Surely not. Furthermore the form I showed has a point,
whereas this example is roughly the equivalent of a
first grade knock-knock joke.
>
I was of course joking. I assumed you were as well.
>
What is the point of (void*){ (long)0.0 }? I don't believe it's a
null pointer constant even in C23.
The null pointer constant is (long)0.0, which it must be for the
compound literal to work. Besides making it obvious that (long)0.0
is a null pointer constant, the compound literal is safer than
using just a cast.
My example is.
Your example actually has two null pointer constants: the
expression being casted, and the full expression casting a null
pointer constant to (void*). But in neither case is that especially
obvious. Also the expression you wrote is less safe. For example,
if it had been written ((void*)('/'/'/'+'/'/'/')), the result would
still be legal C, and compile without problem, but would very likely
not be what was desired. By contrast, if the compound literal had
been written (void*){ (long)1.0 }, it simply would not give a clean
compile, indicating that something is likely askew.