The inclusion of <string> makes the word `minor' special (g++)?

Eljay Love-Jensen eljay@adobe.com
Wed Oct 6 11:37:00 GMT 2004


Hi Sergey,

 >Why would the macros from <sys/sysmacros.h> come up after
the inclusion of <string>?

I suspect because there is a dependency on <sys/sysmacros.h> from <string>, 
probably through <cstring> or some other lower level header file.

 >I'd think they would be #undef'ed somewhere in the C++ include files that 
include the <sys/sysmacros.h>.

Why?  Each header file is responsible for it's own identifiers; it's not 
responsible for second guessing all the identifiers that may-or-may-not 
have been defined or declared by other header files.

 >If anywhere at all, they could be accessible from the <c*> include files 
(if they are covered by the C standard).

System header files are not covered by the C standard.

 >I can already see a large list at the top of every sourcefile :) :

I despise the C preprocessor.

I wish that if a programmer wanted to use a preprocessor directive, it'd be 
explicit, you'd have to do something like this:

#define VALUE 3
int i = VALUE#;

But alas, it's far too late for that to happen.

 >And this only if the compiler is g++ 3.x, and #undef'ing an undefined 
macro isn't polite, so I'd wrap it all in a big ugly #ifdef or a lot of 
smaller but nevertheless ugly #ifdefs.

As far as I am aware, It's not impolite to #undef an identifier that has 
not been defined.

 >Isn't there another solution?

Write a little program that pulls out every single identifier in your code 
and makes a paranoia file "foo.paranoia":
#define return return
#define class class
#define minor minor
#define i i

Then do this at the bottom of your source file:
#include "foo.paranoia"

That will help you discover any identifier collisions with macros.

BTW:  I have seen a #define return macro.  That took days to figure out.

HTH,
--Eljay



More information about the Gcc-help mailing list