问题
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
回答1:
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
.
回答2:
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).
回答3:
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.
来源:https://stackoverflow.com/questions/46797804/defining-something-to-itself-in-c-preprocessor