Я задаюсь вопросом о случаях, когда он отправляет использовать операторы #define и #if. Я знал об этом некоторое время, но никогда не включал это в свой способ кодирования. Как именно это влияет на компиляцию?
Является ли #define единственным, что определяет, включен ли код при компиляции? Если у меня есть #define DEBUGme в качестве пользовательского символа, единственный способ исключить его из компиляции - удалить этот оператор #define?
В 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()
}
Ну, определения часто используются для констант времени компиляции и макросов. Это может сделать ваш код немного быстрее, так как в действительности нет вызовов функций, выходные значения макросов определяются во время компиляции. Символ # очень полезен. Самый простой пример, который я могу придумать, - это проверка на отладочную сборку для добавления дополнительных журналов или сообщений, возможно, даже некоторых функций отладки. Вы также можете проверить различные переменные окружения таким образом.
Другие с большим опытом C / C ++ могут добавить больше, я уверен.
Я часто нахожу себя определяющим некоторые вещи, которые повторяются в определенных функциях. Это делает код намного короче и, следовательно, обеспечивает лучший обзор.
Но, как всегда, постарайтесь найти хорошую меру, чтобы не создавать из нее новый язык. Возможно, потом будет немного трудно читать для периодического обслуживания.
#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);
}
@Ed: при использовании C ++ редко бывает полезно использовать #define по сравнению со встроенными функциями при создании макросов. Идея «большей скорости» - заблуждение. Со встроенными функциями вы получаете ту же скорость, но вы также получаете безопасность типов и никаких побочных эффектов «вставки» препроцессора из-за того, что параметры вычисляются до вызова функции (например, попробуйте написать вездесущий макрос MAX и назовите это так: MAX (x ++, y) .. вы увидите, к чему я клоню).
Мне никогда не приходилось использовать #define в моем C #, и я очень редко использую его для чего-либо другого, кроме проверки версии платформы и компилятора для условной компиляции в C ++.
Является ли #define единственным, что определяет, включен ли код при компиляции? Если у меня есть #define DEBUGme в качестве пользовательского символа, единственный способ исключить его из компиляции - удалить этот оператор #define?
Вы также можете отменить определение символов
#if defined(DEBUG)
#undef DEBUG
#endif
Возможно, наиболее распространенное использование #define в C # - это различие между отладкой / выпуском и различными платформами (например, Windows и X-Box 360 в платформе XNA).
Это для условной компиляции, так что вы можете включать или удалять биты кода на основе атрибутов проекта, которые, как правило:
- Предполагаемая платформа (Windows / Linux / XB360 / PS3 / Iphone и т. Д.)
- Выпуск или отладка (как правило, регистрация, утверждения и т. Д. Включены только в отладочную сборку)
Их также можно использовать для быстрого отключения больших частей системы, например, во время разработки игры, я мог бы определить
#define PLAYSOUNDS
а затем заверните последний вызов, чтобы воспроизвести звук в:
#ifdef PLAYSOUNDS
// Do lots of funk to play a sound
return true;
#else
return true;
Поэтому мне очень легко включать и выключать воспроизведение звуков для сборки. (Обычно я не играю звуки при отладке, потому что это мешает моей личной музыке :)) Преимущество заключается в том, что вы не вводите ветку через добавление оператора if ....