From: Borut R. <bor...@gm...> - 2012-09-30 11:42:38
|
On 30. 09. 2012 04:44, Philipp Klaus Krause wrote: > On 30.09.2012 06:47, Maarten Brock wrote: >> Philipp, >> >> Can you please explain why you added the new 'initialized' and >> 'initializer' segments instead of using the existing 'xinit' and 'xidata'? >> And also why you use 0 to fill a null-pointer instead of NULL? I find that >> counter-intuitive. >> >> Maarten > Well, I am not that familiar with this part of sdcc, so I may have > misunderstood something. I thought xinit and xidata were for > initializing far memory. While the z80-related ports do not currently > have far memory, this is something one might want to add some day > (especially for the z180, r2k, r3ka and gbz80, since these AFAIK do have > hardware for setting the upper address bus bits). So I thought it was > the right thing to use something different for near memory. > AFAIK, sdcc is supposed to follow the GNU coding standard, which says in > section 5.3 "This example uses zero without a cast as a null pointer > constant. This is perfectly fine, except that a cast is needed when > calling a varargs function or when using sizeof." (also 0 is just what I > normally use whenever writing C code). > > Philipp I don't understand the section 5.3 of the GNU coding standard as a prohibition of using NULL. IMHO it should be properly defined in the system header files and normally (hopefully) it is. IMHO char *p = (char *)0 and char *p = NULL are not the same thing (at least theoretically): in the first case p is a pointer to a value on address 0 while in the second case is a pointer to an undefined address, in sense of "nil" or "null" pointers or references in other languages. Unfortunately NULL in C language is normally implemented as pointer to address 0, which makes sense on systems (with MMUs) where the program code is located at lower and data at higher addresses, but it makes troubles on embedded systems and Harvard architecture MCUs where the data memory is at low address (for quicker and shorter instructions for data access), which mean that pointer to address 0 is a perfectly valid pointer. In such systems IMO it wold be better to define NULL as 0xffff (on 16 bit address space) or (void *) -1. But we are where we are :-( . In short: IMHO it is better to use NULL instead of 0, (void *)0 or (char *)0. (At least until somebody convinces me that I'm wrong ;-) ). If we'll find a common agreement I'll add it to the http://sourceforge.net/apps/trac/sdcc/wiki/SDCC%20coding%20style wiki page. Borut |