Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3]  Все   Вниз
  Печать  
Автор Тема: не могу жить без #define :)  (Прочитано 41463 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LifeMaker
Гость
« Ответ #60 : 04-06-2008 20:28 » 

LifeMaker,
Цитата
дык это же сильно неудобно, при каждом вызове функции обрамлять её #idef'ом.
зачем делать 100 раз то, что можно сделать один раз?
и всех коллег заставлять? (я ведь не один программист на проекте) и каждый вечер просматривать весь проект, проверять, чтоб никто не забыл #idef поставить. и всё равно забудут где-нить поставить и я не замечу.

вот для этого и это все обернуто в функцию (точнее конструктор), да ее вызов и создание объекта на стеке надо будет стерпеть (потеря производительности на лицо, но если это не критично). Ну а параметры вычисляй уже внутри ifdef (если это не возможно, то и макрос тебя не спасет от их вычислений)

В класс лучше оборачивать чем просто в функцию много потенциальных бонусов при минимуме затрат
я смотрю мы немного недопонимаем друг друга... давай лучше я приведу свой код и объяню, почему я использую макрос и ничто другое.
задача написать вспомогательное нечто, позволяющее легко, не заморачиваясь выводить в уже открытый стандартный FILE* некую форматную строку, возможно не только в файл, но и в Debug Output Visual Studio, TTY игровую консоль, куда угодно в общем-то...
иметь возможность отключить всё это не имея при этом оверхеда (это игровое приложение), в Release-билде каждый FPS на счету.
я могу поместить WRITE_LOG в цикл рендера, там даже вызов пустой функции или пустой конструир объекта с парой параметров может очень сильно подпортить жизнь...
вот так:
Код:
WRITE_LOG("ptr is NULL");
WRITE_LOG("File '%s' not found.",filename.c_str());
WRITE_LOG("Players scores: '%d'.",mPlayerScores);
WRITE_LOG("Matrix value is: %f %f %f %f - %f %f %f %f - %f %f %f %f - %f %f %f %f",mtx[0][0],mtx[0][1],mtx[0][2],mtx[0][3],
mtx[1][0],mtx[1][1],mtx[1][2],mtx[1][3],mtx[2][0],mtx[2][1],mtx[2][2],mtx[2][3],mtx[3][0],mtx[3][1],mtx[3][2],mtx[3][3],);

WRITE_LOG("Player2 health: %f", gGameDataBase->FindPlayerNode("Player2")->GetHealth());

// реализация примерно так WRITE_LOG

#ifdef NDEBUG

#define WRITE_LOG(...)

#else

#ifdef WIN32

#define WRITE_LOG(...) { \
    fprintf(gLogFile,__VA_ARGS__);fprintf(gLogFile,"\n"); \
    char buf[512]; sprintf(buf,__VA_ARGS__); OutputDebugString("buf"); OutputDebugString("\n"); \
}

#endif

#ifdef PS3

#define WRITE_LOG(...) { \
    fprintf(gLogFile,__VA_ARGS__);fprintf(gLogFile,"\n"); \
    PSSG_PRINTF(__VA_ARGS__); PSSG_PRINTF("\n"); \
}

#endif

#endif
при таком подходе в релиз-билде не остаётся ни вызова пустой функции, ни вычисления параметров для формирования строки (как видно из примера - это может быть много параметров или вызовы тяжелых функций поиска и т.п.)

отдельный момент, ради которого используется макрос: проверка GCC компилятором корректности форматной строки.
т.е. вот что он говорит на вот таком коде:
Код:
1: // test.cpp
2: #include <stdio.h>
3: int main()
4: {
5: float f;
6: int i;
7: printf("%d %f",f,i);
8: return 0;
9: }

test.cpp: In function `int main()':
test.cpp:7: warning: int format, double arg (arg 2)
test.cpp:7: warning: double format, different type arg (arg 3)
полезная подсказка чаще всего программист ошибается вот так
Код:
std::string str;
printf("%s",str); //плохо
printf("%s",str.c_str()); //надо было так, все об этом знают, но часто забывают, а вылазит только в рантайме...
так вот, к чему это я... вариант с функцией выглядит примерно так...
Код:
void WRITE_LOG(const char* fmt, ...)
{
#ifndef NDEBUG
    va_list argList;
    va_start(argList, fmt);
    char buffer[bufSize];
    vsnprintf(buffer, bufSize, fmt, argPtr);
    va_end(argList);
    OutputDebugString(buffer);
    OutputDebugString("\n");
#endif
}
в итоге GCC говорит что-то вроде warning: Format string is not literal. Unable to check parameters.
итого, мы потеряли ценную информацию от компилятора. в случае с макросом вся информация сохраняется, как буд-то мы передали параметры непосредственно в printf (что мы собственно и сделали). и warning уже выручал меня раза три, и коллег уже выручал, хотя WRITE_LOG'у этому всего неделя примерно... и выручит, я думаю, ещё не раз
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #61 : 30-09-2009 10:44 » 

Код:
#define m(a,b,c) a+b+c

int i=m(1,,,,2,,,3,);

это компилируется ))) А почему
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #62 : 30-09-2009 11:25 » 

Опять олифишь? Ага

warning C4002: too many actual parameters for macro 'm'
error C2105: '++' needs l-value
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #63 : 30-09-2009 11:34 » 

это в VC6 было, вернее не совсем прям так запущено, а двойная запятая была ) Прокатывает
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #64 : 30-09-2009 12:30 » 

Лёш, что значит двойная запятая? Какая разница?

Ты поставь себя на место компилятора:

из твоего выражения получается так
i = 1++;

остальные параметры значения не имеют, но первые три затребованные должны присутствовать. А так ты и получаешь ошибку: C2105: '++' needs l-value.

Если например ты возьмёшь вот такой вариант:
int i=m(1,2,3,4,5,6,,,,,,7,,,,,,,);

или даже такой

int i=m(1,2,3,4,5,"hallo",new CEdit());

то, кроме предупреждения о превышении числа параметров, всё будет в порядке. Остальные параметры нигде не фигурируют поэтому будут проигнорированы.

Но обязательные должны присутствовать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #65 : 01-10-2009 03:22 » 

в том и дело, что в 6-й подряд идущие запятые (даже разделённые переводом строки) в параметрах воспринимаются как одна запятая
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #66 : 01-10-2009 06:32 » 

Покажи точно, какая у тебя строка компилится в шохе.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #67 : 01-10-2009 06:40 » 

так я показал
Код:
#define m(a,b,c) a+b+c

int i=m(1,,,,2,,,3,);


и не просто компилится, но ещё и выполняется правильно
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #68 : 01-10-2009 07:21 » 

Я вот про что:

вернее не совсем прям так запущено, а двойная запятая была

зы В любом случае так лучше не делать, как минимум в 2003 уже не прокатит.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #69 : 07-12-2009 15:38 » 

LifeMaker, хехехе... или гибкость или скорость, от теории к практике путь тернист.

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

Итого, если это не модули ПО, от которых требуется выжать максимум из железки по какому-то показателю,  а "гражданское" приложение, то макросы в утиль. Если это "боевой" слой, то какие нах обертки и т.д. - дефайн (если он оправдан и нужен) рулеззз.
Записан

С уважением Lapulya
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #70 : 08-12-2009 04:02 » 

lapulya, копил обиду полтора года ? ))  С возвращением, кстати Улыбаюсь
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #71 : 28-12-2009 12:17 » 

Угу, шучу... А где заяц? Синий такой...
Записан

С уважением Lapulya
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #72 : 28-12-2009 13:45 » 

Пробегает временами. Чаще по аськам.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: 1 2 [3]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines