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

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

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

18 c#
19.08.2008 05:16:34
8 ОТВЕТОВ
РЕШЕНИЕ

В C # #defineмакросы, как и в некоторых примерах Бернарда, не допускаются. Единственное распространенное использование #define/ #ifs в 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()
        }
13
30.10.2013 13:52:28

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

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

1
19.08.2008 05:23:07

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

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

1
19.08.2008 05:30:12

#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);
     }
9
27.07.2012 09:23:06

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

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

1
19.08.2008 05:44:15

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

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

#if defined(DEBUG)
#undef DEBUG
#endif
3
19.08.2008 05:59:22

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

0
19.08.2008 11:16:44

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

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

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

#define PLAYSOUNDS

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

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

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

0
19.08.2008 11:29:13