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

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

18 голосов
/ 19 августа 2008

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

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

Ответы [ 8 ]

13 голосов
/ 19 августа 2008

В 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()
        }
9 голосов
/ 19 августа 2008

# 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);
     }
3 голосов
/ 19 августа 2008

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

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

#if defined(DEBUG)
#undef DEBUG
#endif
1 голос
/ 19 августа 2008

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

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

1 голос
/ 19 августа 2008

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

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

1 голос
/ 19 августа 2008

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

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

0 голосов
/ 19 августа 2008

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

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

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

#define PLAYSOUNDS

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

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

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

0 голосов
/ 19 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...