On Fri, 6 Oct 2006, Chris Lightfoot wrote: > Relevant references (from the C99 final committee draft > but I think these carry over to the real standard):
Ah. I am sufficiently ancient to be still working from the C90 standard. > 6.8.4.1.2 > if (x) ... > is equivalent to > if (x != 0) ... C90 doesn't say that explicitly, but I suppose it implies it. It says that the expression must be of scalar type, and that it is compared to zero. > 6.3.2.3 > ``An integer expression with the value 0, or such an > expression cast to type void*, is called a null > pointer constant. If a null pointer constant is > assigned to or compared for equality to a pointer, the > constant is converted to a pointer of that type.'' Aha! That text does indeed also appear in C90 3.2.2.3. I had overlooked it. It does seem to mandate that NULL is the same as zero. So I have to concede that if(x) where x is a pointer is standard-conforming code. However, I still don't like using if(x) where x is a pointer because when you come across if(x) in the middle of code, it gives you no clue as to what type x is, whereas if(x==NULL) makes it clear that x is a pointer and if(x==0) makes it clear that x holds a number. *That*'s my real point. > Actually from a brief grep exim isn't free of assumptions > about the in-memory format of different objects. e.g. > demime.c does, > > memset(&mime_part_p,0,sizeof(mime_part)); > > to clear the contents of the struct mime_part mime_part_p. > (There are various other uses of memset(p, 0, sizeof *p) > but I didn't check whether the elements of the p include > pointers specifically.) Of course that assumes that the > appropriate zero or null value for each of the elements of > the struct is all-bits-zero. That's not necessarily true Indeed. I wonder if I wrote any of those? (I didn't write the one that you quote.) My gut feeling is that I would only do that if all the items in the structure were integers, but you never know. :-) ... Curiosity got the better of me, and I checked ... looks like the only dodgy cases are where I've done it for the system structs addrinfo, sockaddr, and stat. -- Philip Hazel University of Cambridge Computing Service Get the Exim 4 book: http://www.uit.co.uk/exim-book -- ## List details at http://www.exim.org/mailman/listinfo/exim-users ## Exim details at http://www.exim.org/ ## Please use the Wiki with this list - http://www.exim.org/eximwiki/
