# определить цель директивы

Какова цель и правильное использование директивы #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-м примере здесь. И я понятия не имею, как поддерживать этот код.

7
задан Brian Tompsett - 汤莱恩 29 November 2015 в 14:43
поделиться