Defining something to itself in C preprocessor

前端 未结 3 1796
-上瘾入骨i
-上瘾入骨i 2021-01-13 18:53

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

相关标签:
3条回答
  • 2021-01-13 18:57

    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 #define true because that would "erase" every further use of true, so it has to be exactly#define true true.

    0 讨论(0)
  • 2021-01-13 19:05

    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.

    0 讨论(0)
  • 2021-01-13 19:08

    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).

    0 讨论(0)
提交回复
热议问题