Подтвердить что ты не робот

Какое действие имеет #define X X в C?

В исходном коде stdbool.h в проекте LLVM он читает:

/* Don't define bool, true, and false in C++, except as a GNU extension. */
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#elif defined(__GNUC__) && !defined(__STRICT_ANSI__)
/* Define _Bool, bool, false, true as a GNU extension. */
#define _Bool bool
#define bool  bool
#define false false
#define true  true
#endif

В последних 4 строках есть три строки из #define X X. Почему ты бы так поступил? Что это меняет? Разве этот компилятор не заменит, скажем, true на true?

4b9b3361

Ответ 1

Единственная причина, по которой я могу думать, это то, что инструкции препроцессора типа

#ifdef bool
// do some stuff or define bool
#endif

в других c файлах, включенные впоследствии, будут работать правильно и не пытаться переопределить bool по-другому, например

#define bool int

что помешало бы первому определению

Ответ 2

#define X X

приводит к тому, что "предварительный процессор условный" *:

#ifdef X

"true" "успешно". *


* update

Ответ 3

Это изменит, что true, false и т.д. теперь являются макросами. Итак, код вроде этого

#if defined(true)
    ...
#else
    ...
#endif

.