Path: ...!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c Subject: Re: question about nullptr Date: Sun, 25 Aug 2024 18:18:23 -0700 Organization: None to speak of Lines: 40 Message-ID: <87wmk4dqu8.fsf@nosuchdomain.example.com> References: <90c2181ae4c7aac8f17f076093923d5b357c43aa@i2pn2.org> <874j8yswha.fsf@bsb.me.uk> MIME-Version: 1.0 Content-Type: text/plain Injection-Date: Mon, 26 Aug 2024 03:18:23 +0200 (CEST) Injection-Info: dont-email.me; posting-host="bc88295ca556238feaf2ba55fe5de0e2"; logging-data="2283292"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18rUVSbPeJ1USw4W6YhgCrJ" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:zMBAZEpAqfxdvWaIxDbGvoa3F1g= sha1:rBqWt8pPvZuo5q1o87BWV8twpM4= Bytes: 2980 James Kuyper writes: > On 8/25/24 16:56, dave_thompson_2@comcast.net wrote: >> On Wed, 10 Jul 2024 11:09:41 -0400, James Kuyper >> wrote: >> >>> NULL is required to expand >>> into a null pointer constant ... 0 and (void*)0 are the >>> two most likely and common choices. >>> >> ((void*)0) >> >> Otherwise NULL["foo"] gives quite the wrong result > > Correct. Sorry. A mostly meaningless price of trivia: In C17 and earlier, an excessively literal reading of the standard implies that ((void*)0) is not a null pointer constant. It says that a null pointer constant is "An integer constant expression with the value 0, or such an expression cast to type void *". It does not say that a parenthesized null pointer constant is a null pointer constant. (And (void*)0 is a null pointer constant but not a valid definition for NULL.) C23 fixes this by updating the wording for parenthesized expressions. C17: "A *parenthesized expression* is a primary expression. Its type and value are identical to those of the unparenthesized expression. It is an lvalue, a function designator, or a void expression if the unparenthesized expression is, respectively, an lvalue, a function designator, or a void expression." C23: "A *parenthesized expression* is a primary expression. Its type, value, and semantics are identical to those of the unparenthesized expression." This was surely the intent all along. -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */