I ran into these lines:
#define bool bool
#define false false
#define true true
I don't think I need to say more than "wtf?", but just to be clear: What is the point of defining something to itself?
The lines come from clang stdbool.h
I ran into these lines:
#define bool bool
#define false false
#define true true
I don't think I need to say more than "wtf?", but just to be clear: What is the point of defining something to itself?
The lines come from clang stdbool.h
The C and C++ standards explicitly allow that (and requires that there is no infinite expansion)
BTW, function-like recursive (or self-refential) macros are even more useful:
#define puts(X) (nblines++,puts(X))
(the inner puts
is a call to the standard puts
function; the macro "overloads" such further calls by counting nblines
)
Your define could be useful, e.g. with later constructs like #ifdef true
, and it can't be a simple because that would "erase" every further use of #define true
true
, so it has to be exactly#define true true
.
It allows the user code to conditionally compile based on whether those macros are or aren't defined:
#if defined(bool)
/*...*/
#else
/*...*/
#endif
It basically saves you from having to pollute the global namespace with yet another name (like HAVE_BOOL
), provided that the implementation lets its users know that iff it provides a bool
, it will also provide a macro with the same name that expands to it (or the implementation may simply use this internally for its own preprocessor conditionals).
It is called self referential Macros.
According to gcv reference :
A self-referential macro is one whose name appears in its definition. Recall that all macro definitions are rescanned for more macros to replace. If the self-reference were considered a use of the macro, it would produce an infinitely large expansion. To prevent this, the self-reference is not considered a macro call. It is passed into the preprocessor output unchanged.
Reference example :
One common, useful use of self-reference is to create a macro which expands to itself. If you write
#define EPERM EPERM
then the macro EPERM expands to EPERM. Effectively, it is left alone by the preprocessor whenever it’s used in running text. You can tell that it’s a macro with ‘#ifdef’. You might do this if you want to define numeric constants with an enum, but have ‘#ifdef’ be true for each constant.