From: | "Simon 'corecode' Schubert" <corecode@xxxxxxxxxxxx> |
Date: | Thu, 6 Jan 2005 10:34:23 +0100 |
On Thursday, 6. January 2005 10:00, Adrian Bocaniciu wrote: > As I have already mentioned in a follow-up to my recent bug report, the > essential ports net/quagga and net/zebra have been totally broken by the > use of lower-case macros in the DragonFly system headers. > > There is an old C tradition that the identifiers used in macro > definitions must be written entirely with capital letters and that no > other identifiers should be written like that. This tradition has not > been caused by esthetic reasons but by the need to separate the name > spaces for macros and for other identifiers. I think you are mistaking something here. Macros are traditionally written upper case if they evaluate their arguments more than one time, iirc. If you want to be portable, #define POSIX_SOURCE or what it is called and don't include sys/* files. These lower case macros are usually for convenience or compatibility. For example <netdb.h>: struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses from name server */ #define h_addr h_addr_list[0] /* address, for backward compatibility */ }; as you can see, it's an often used compatibility define. and those are usually prefixed with an acronym from the struct (h_). Unfortunately, conflicts happen, but you can't avoid it. Removing those defines would result in a much larger breakage, I'd guess. > In the case of net/route.h, where I first encountered such macros, they > were used to provide alternate names for some structure members. That > can be done in a perfectly safe way without macros, by using anonymous > unions. Even if, for some very stupid reason (as the named unions were > really a mistake in the original C design) the anonymous unions have not > made their way yet into the official C standard, gcc and most other C > compilers support anonymous unions also in C, not only in C++. I'm not sure if this will always work. Could you give an example which will compile with gcc2 and gcc34 without warnings? cheers simon -- /"\ \ / \ ASCII Ribbon Campaign / \ Against HTML Mail and News
Attachment:
pgp00001.pgp
Description: PGP signature