Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #387536
| From | Keith Thompson <Keith.S.Thompson+u@gmail.com> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: question about nullptr |
| Date | 2024-08-12 18:44 -0700 |
| Organization | None to speak of |
| Message-ID | <87ikw5gpsn.fsf@nosuchdomain.example.com> (permalink) |
| References | (10 earlier) <86le2b9ru6.fsf@linuxsc.com> <8734ojxlg7.fsf@nosuchdomain.example.com> <86msmp8fld.fsf@linuxsc.com> <87cynluekl.fsf@nosuchdomain.example.com> <86plqdz0q3.fsf@linuxsc.com> |
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:
>>> 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.
Depending on the context, a null pointer constant is not necessary for
the compound literal to work. Adapting your example from elsethread :
#include <stdio.h>
int main(void) {
void *np = (long)0.0;
printf(" null pointer : %p\n", (void*){ np });
}
> Besides making it obvious that (long)0.0
> is a null pointer constant, the compound literal is safer than
> using just a cast.
I fail to see how it's safer.
>> My example is.
>
> Your example actually has two null pointer constants:
It actually has four, but how is that relevant?
I wrote :
But surely ((void*)('/'/'/'-'/'/'/')) is more elegant.
The following are all null pointer constants :
'/'/'/'-'/'/'/'
('/'/'/'-'/'/'/')
(void*)('/'/'/'-'/'/'/')
((void*)('/'/'/'-'/'/'/'))
But I never said otherwise. I merely said that my example (the
outermost expression) is an NPC.
> 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.
One more time: It was a joke. I thought that was obvious when I wrote
it. If it wasn't, you know now.
--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
void Void(void) { Void(); } /* The recursive call of the void */
Back to comp.lang.c | Previous | Next — Previous in thread | Find similar
Re: question about nullptr Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-12 18:10 -0700 Re: question about nullptr Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-12 18:44 -0700
csiph-web