Какова цель и правильное использование директивы #define в C #?
По этой теме уже есть несколько вопросов, но ответа мне не нужно. Они лишь приводят примеры, как это работает. Но мне нужно более подробное объяснение :, почему он существует и каковы хорошие способы его использования (, если таковые имеются ).
В основном я знаю, как его использовать, но для меня использование выглядит странно. Давайте посмотрим на пример:
#define DEV
#if DEV
Console.WriteLine("Development trace log message");
#endif
Для меня это полностью отличается от использования #, если условная сборка с проектом -определяет символы условной компиляции . Если мы используем определенный символ проекта -, он присоединяется к конфигурации сборки проекта, и мы можем управлять кодом, необходимым для сборки (и исключенным из сборки )с используемой конфигурацией сборки. Итак, код
#if DEBUG
Console.WriteLine("Debug log message");
#endif
это хорошо для меня. Но, как я уже сказал, это полностью отличается от использования директивы #define, потому что ею можно управлять. Правильно ли я понимаю, что 1-м примером можно управлять только вручную, комментируя/раскомментируя #строку определения в каждой сборке? Если да, то это неуправляемо, -трудно -поддерживать, и я думаю, что такое использование #define является чрезвычайно плохой практикой и вообще не должно существовать в языке.
Я могу себе представить использование #define/ #undef внутри #оператора if. Что-то вроде
#if DEBUG
#if CLIENT1
#define TEST_CLIENT1
#endif
#endif
#if TEST_CLIENT1
connectionString = "Some specific test connection" //I know this is bad practice even in conditional. Only for example purpose.
#elif
//Read connection from config
#endif
#if UNITTESTS
#undef TEST_CLIENT1
#endif
#if TEST_CLIENT1
Console.WriteLine("Some message");
#endif
Извините за такой сложный пример, но это по крайней мере то, что я могу найти полезным. Хотя я бы никак не стал писать такой код = ). Есть ли хорошее применение #определить?
PS :Я никогда не пользовался #define за 5 лет и не хотел этого делать, но мне попался проект поддержки, в котором много странных дефайнов, которые даже названы странно. Эти определения обычно размещаются в верхней части файла,как в моем 1-м примере здесь. И я понятия не имею, как поддерживать этот код.