Позвольте мне попытаться ответить простым простым способом.
Во-первых, вы являетесь правильными макросами, которые имеют свою собственную логику и, возможно, вы понимаете, как они являются препроцессорами и всеми. Если нет, то препроцессоры - это первый бит кода, который читает компилятор, вне зависимости от того, где в исходном коде они появляются.
После того, как компилятор проверяет макросы, возможно, как здесь, в вашем случае, что определенная часть вашего обычного кода становится «невидимой» для компилятора. Теперь давайте проанализируем, как и что станет скрытым или невидимым кодом в вашем случае. В этом случае вы используете #define A
и #define C
. Это похоже на логическое (но не совсем), что A и B были объявлены «истинными» или «определенными».
Затем с #ifdef A
(#ifdef
: это краткая форма, если она определена) здесь есть инструкция if. Он проверяет, определено ли «A» или нет. В вашем случае A определено так, что мы переходим к следующей части, которая может рассматриваться как код внутри этого оператора if. Если бы A не были определены здесь, мы бы перешли ко второму #else // A is not defined
.
Итак, теперь мы проверяем #ifdef B
и нет B в вашем случае не определено, поэтому мы переходим к первому #else // A is defined AND B is NOT defined
, который следует ниже. Следовательно, установка значения I--2. #endif
подобен закрывающим фигурным скобкам второго оператора if. Затем мы переходим ко второму #endif
, потому что A было определено, поэтому мы не переходим ко второму #else
.
В итоге вы получите ответ как -2. Я проверил этот код, и он возвращает -2.
Вы определяете A и C. С помощью '#ifdef A' вы можете протестировать A. Или используйте '#ifndef A'to test, если он не определен. В зависимости от результата код в этой части будет скомпилирован для программы. Это часто используется в файлах заголовков, чтобы предотвратить децилерации или определения, которые будут выполняться дважды. – Flikk
2nd one prints -3, потому что A больше не определен. '#ifdef C' находится внутри' #ifdef A', и он даже не будет проверен. И '# else'' #ifdef A' является '-3' – Flikk
Что вы ожидаете и почему? – Olaf