Как использовать #define?

Меня интересуют случаи, когда он заставляет использовать операторы #define и #if. Я знал об этом некоторое время, но никогда не использовал это в своем способе кодирования. Как именно это влияет на компиляцию?

#Define - единственное, что определяет, включен ли код при компиляции? Если у меня есть #define DEBUGme в качестве настраиваемого символа, единственный способ исключить его из компиляции - удалить этот оператор #define?

Ответов (8)

Решение

В C# #define макросы, как и некоторые примеры Бернарда, недопустимы. Единственное распространенное использование #define / #if s в C# - это добавление необязательного кода только для отладки. Например:

        static void Main(string[] args)
        {
#if DEBUG
            //this only compiles if in DEBUG
            Console.WriteLine("DEBUG")
#endif 
#if !DEBUG
            //this only compiles if not in DEBUG
            Console.WriteLine("RELEASE")
#endif
            //This always compiles
            Console.ReadLine()
        }

#define используется для определения констант времени компиляции, которые можно использовать с #if для включения или исключения битов кода.

#define USEFOREACH

#if USEFOREACH
    foreach(var item in items)
     {  
#else
    for(int i=0; i < items.Length; ++i)
     { var item = items[i];   //take item
#endif

       doSomethingWithItem(item);
     }

Я часто обнаруживаю, что определяю некоторые вещи, которые повторяются в определенных функциях. Это делает код намного короче и, таким образом, дает лучший обзор.

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

Возможно, наиболее частым использованием #define в C# является различение между отладкой / выпуском и разными платформами (например, Windows и X-Box 360 в структуре XNA).

#Define - единственное, что определяет, включен ли код при компиляции? Если у меня есть #define DEBUGme в качестве настраиваемого символа, единственный способ исключить его из компиляции - удалить этот оператор #define?

Вы также можете отменить определение символов

#if defined(DEBUG)
#undef DEBUG
#endif

Ну, определения часто используются для констант времени компиляции и макросов. Это может сделать ваш код немного быстрее, поскольку на самом деле нет вызовов функций, выходные значения макросов определяются во время компиляции. # If очень полезны. Самый простой пример, который я могу придумать, - это проверка отладочной сборки для добавления дополнительных журналов или сообщений, возможно, даже некоторых функций отладки. Таким же образом вы также можете проверить различные переменные среды.

Я уверен, что другие, более опытные в C/C++, могут добавить больше.

@Ed: при использовании C++ редко бывает выгоднее использовать #define над встроенными функциями при создании макросов. Идея «большей скорости» - заблуждение. Со встроенными функциями вы получаете ту же скорость, но вы также получаете безопасность типов и никаких побочных эффектов препроцессорной «вставки» из-за того, что параметры оцениваются до вызова функции (например, попробуйте написать вездесущий макрос MAX , и назовите его так: MAX (x ++, y) .. вы увидите, к чему я клоню).

Мне никогда не приходилось использовать #define в моем C#, и я очень редко использую его для чего-либо, кроме проверки версии платформы и компилятора для условной компиляции на C++.

Это для условной компиляции, поэтому вы можете включать или удалять фрагменты кода на основе атрибутов проекта, которые, как правило, следующие:

  • Предполагаемая платформа (Windows / Linux / XB360 / PS3 / Iphone .... и т. Д.)
  • Выпуск или отладка (обычно ведение журнала, утверждения и т. Д. Включены только в отладочную сборку)

Их также можно использовать для быстрого отключения больших частей системы, например, во время разработки игры, я мог бы определить

#define PLAYSOUNDS

а затем завершите последний вызов, чтобы воспроизвести звук:

#ifdef PLAYSOUNDS
// Do lots of funk to play a sound
return true;
#else
return true;

Так что мне очень легко включать и выключать воспроизведение звуков для сборки. (Обычно я не проигрываю звуки при отладке, потому что это мешает моей личной музыке :)) Преимущество состоит в том, что вы не создаете ветку, добавляя оператор if ....