Могут ли директивы препроцессора C # быть вложенными? - PullRequest
0 голосов
/ 05 апреля 2019

Я немного погуглил, но не нашел никаких положительных утверждений о вложенности директив препроцессора.Я хотел бы иметь возможность сделать что-то вроде этого:

#if FOO
// do something
#if BAR
// do something when both FOO and BAR are defined
#endif 
#endif

Я знаю, что вместо этого могу сделать что-то вроде ниже, но просто интересно.

#if FOO && (!BAR)
#elif FOO && BAR
#endif

(Правка) На самом деле у меня естьболее сложное вложенное выражение уже активно в моем коде, но оно не выполняет то, что я ожидаю.Отсюда мое любопытство, есть ли официальное мнение об этом.

1 Ответ

3 голосов
/ 05 апреля 2019

Да, они могут быть вложенными.

#define A
#define B

void Main()
{
#if A
#if B
    Console.WriteLine("A and B");
#else
    Console.WriteLine("A and not B");
#endif
#else
#if B
    Console.WriteLine("B and not A");
#else
    Console.WriteLine("neither A nor B");
#endif
#endif
}

Выходы:

A and B

Вот вам .NET Fiddle , чтобы вы могли попробовать.

Вы можете закомментировать две строки вверху отдельно, чтобы получить разные результаты, например:

#define A
// #define B

Выходы:

A and not B

Вот тот же код с отступом, которыйделает это более понятным, хотя я бы не делал отступ в таком коде.Чрезмерное использование таких условных директив, на мой взгляд, является запахом кода.

#define A
// #define B

void Main()
{
    #if A
        #if B
            Console.WriteLine("A and B");
        #else
            Console.WriteLine("A and not B");
        #endif
    #else
        #if B
            Console.WriteLine("B and not A");
        #else
            Console.WriteLine("neither A nor B");
        #endif
    #endif
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...