Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Необходимость #define

281
11 мая 2007 года
Fan][
279 / / 19.12.2003
Подскажите, пожалуйста, какая необходимость с точки C++ наличие #define в этом коде:

Код:
#define SIZE_BUF 4096

void main()
{
    ENUM_SERVICE_STATUS Status[SIZE_BUF];
    DWORD Size = sizeof(Status);
    DWORD Needed = 0;
    DWORD Return = 0;
    DWORD Handle = 0;
    SC_HANDLE Manager;

    Manager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

    if (Manager!=NULL)
    {
        if (EnumServicesStatus(Manager,SERVICE_WIN32,SERVICE_ACTIVE,
                              (LPENUM_SERVICE_STATUS)&Status,Size,
                              &Needed,&Return,&Handle))
        {
            for (unsigned int x=0; x < Return; x++)
                cout << Status[x].lpServiceName << endl;
        }
        else cout << "Error Open Manager " << endl;
    }
    else cout << "Error enum Services" << endl;
}
17K
11 мая 2007 года
kilowatt
27 / / 13.01.2007
Это константа, размер буфера.
ENUM_SERVICE_STATUS Status[SIZE_BUF];
!!!
2.2K
11 мая 2007 года
e1vin
153 / / 04.06.2006
Для С++ никакой; такой прием часто использовался (и используется, наверное :)) сишными кодерами. Все умудренные опытом господа, такие как Брюс Эккель, Герберт Шилдт и иже с ними, рекомендуют использовать именованные константы (enum ... ) вместо директив препроцессора, аргументируя это тем, что по такой директиве препроцессор просто заменяет в исходнике все SIZE_BUF на число 4096. При это для него не производятся ни проверка соответсвия типов, ни приведение типов, в общем очень легко нарваться на какую-нибудь нетривиальную ошибку.
23K
16 мая 2007 года
x_000
6 / / 18.12.2006
В таких случаях лучше использовать константы.А реально #define нужен только в чистом си, где с константами не поддерживались константые операции например:
const int size = 10;int buf[size+10];
В чистом си такая операция недопустима,а в си++ вполне допустима.
255
17 мая 2007 года
Dart Bobr
1.4K / / 09.04.2004
Имхо, лучше всего не использовать статические массивы. memalloc - в руки и вперед ))
92
18 мая 2007 года
Тень Пса
2.2K / / 19.10.2006
Dart Bobr, это C, а вопрос о C++ - соотвессна new и delete. и вообще в С++ есть STL ;)

а #define это Сишный стиль, тупая замена в коде программы (x_000 и e1vin правы), если уж пишем на С++, то пользуем const (то бишь ответ на вопрос автора: "Никакой!" :) )
20K
23 мая 2007 года
sja
22 / / 08.01.2007
может в этом дефайние и нет никакого смылса, но меня спасает

#define flase false

:)
255
23 мая 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Тень Пса

а #define это Сишный стиль, тупая замена в коде программы (x_000 и e1vin правы), если уж пишем на С++, то пользуем const (то бишь ответ на вопрос автора: "Никакой!" :) )


а как же ты тогда при помощи констант сделаешь точ то делают:
#IFDEF, #IFNDEF ??
Насколько я читал Мсдн, то пришел к выводу, что хоть #define и берет сове начало еще в С, но это не делает их не частью стандарта С++. Во-первых const - задается еще на этапе компиляции программы, а #define - препроцессорная директива. Так что разница - огромная!!

92
23 мая 2007 года
Тень Пса
2.2K / / 19.10.2006
Цитата:
Подскажите, пожалуйста, какая необходимость с точки C++ наличие #define в этом коде:



как бы на вопрос и ответил )

#IFDEF, #IFNDEF - согласен, не заменишь :) они нужны

309
23 мая 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:

а как же ты тогда при помощи констант сделаешь точ то делают:
#IFDEF, #IFNDEF ??


Это директивы условной компиляции. Соответственно, DEFINE следует использовать ТОЛЬКО для объявления значений, используемых в этом действии

 
Код:
#DEFINE ARSIZE 256

#IF (ARSIZE > 1024)
// Код для обработки массива с размером больше 1024
#ELSE
// Код для обработки массива с размером меньше или равно 1024

#ENDIF

Всё. В любых других случаях используем const int или enum.
В первом случае при запуске программы создаётся объект константы. Во втором компилятор производит замену имени на значение
255
23 мая 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: el scorpio
Это директивы условной компиляции. Соответственно, DEFINE следует использовать ТОЛЬКО для объявления значений, используемых в этом действии
 
Код:
#DEFINE ARSIZE 256

#IF (ARSIZE > 1024)
// Код для обработки массива с размером больше 1024
#ELSE
// Код для обработки массива с размером меньше или равно 1024

#ENDIF

Всё. В любых других случаях используем const int или enum.
В первом случае при запуске программы создаётся объект константы. Во втором компилятор производит замену имени на значение


Вы глубоко заблуждаетесь. Откроем мсдн, на страничке посвященой оператору #define.
Итак, что мы там можем прочитать? Цитата:

Цитата:
The second syntax form allows the creation of function-like macros. This form accepts an optional list of parameters that must appear in parentheses. References to the identifier after the original definition replace each occurrence of identifier( identifieropt, ..., identifieropt ) with a version of the token-string argument that has actual arguments substituted for formal parameters.


и пример из того же мсдна:

Цитата:
// Macro to define cursor lines
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range
#define getrandom(min, max) \
((rand()%(int)(((max) + 1)-(min)))+ (min))


Следовательно, #define можна использовать для определения макросов!

92
23 мая 2007 года
Тень Пса
2.2K / / 19.10.2006
можно. но стоит ли?

в макросах не проводится проверка на совместимость типов подставляемых значений... ну и в конце концов можно вместо макросов использовать inline функции )

Цитата:

[FONT=Times New Roman]В отличие от #define макросов, встроенные (inline) функции неподвержены известным ошибкам двойного вычисления, поскольку каждый аргумент встроенной функции вычисляется только один раз. Другими словами, вызов встроенной функции - это то же самое что и вызов обычной функции, только быстрее:[/FONT]

Код:
// Макрос, возвращающий модуль (абсолютное значение) i
[FONT=Courier New]    #define unsafe(i) \
        ( (i) >= 0 ? (i) : -(i) )

// Встроенная функция, возвращающая абсолютное значение i
    inline
    int safe(int i)
    {
        return i >= 0 ? i : -i;
    }

    int f();

    void userCode(int x)
    {
        int ans;
        ans = unsafe(x++); // Ошибка! x инкрементируется дважды
        ans = unsafe(f()); // Опасно! f() вызывается дважды
        ans = safe(x++); // Верно! x инкрементируется один раз
        ans = safe(f()); // Верно! f() вызывается один раз
    }[/FONT]


следовательно, #define лучше не использовать, если в этом нет супернеобходимости :)
320
23 мая 2007 года
m_Valery
1.0K / / 08.01.2007
Из книги Бьерн Страуструп "Язык программирования С++"
Предисловие автора к русскому изданию стр.26
Цитата:
"В третьем издании языка программирования С++ мне удалось избавиться от почти всех макросов...Я считаю принятую в С/С++ форму макросов,которую теперь можно считать устаревшей благодаря наличию более подходящих средств языка,таких как шаблоны,пространства имен
,встроенные функции и константы.Точно так же,широкое использование приведений типов в любом языке свидетельствует о плохом проектировании.Как макросы,так и приведения являются частыми источниками ошибок. Тот факт,что без них можно обойтись делает программирование на С++ куда более безопасным и элегантным."


глава 1 пукт 1.6.1 стр.50.

Цитата:
"Макросы почти никогда не требуются в С++.Пользуйтесь const или enum для определения констант."


Далее смотрим "Стандарты программирования на С++" Герба Саттера и Андрея Александреску. правило 16 стр.44

Цитата:
"Макрос - самый неприятный инструмент С и С++,оборотень, скрывающийся под личиной функции,кот, гуляющий сам по себе и не обращающий внимания на границы ваших областей видимости.Берегитесь
его!...Первое правило по применению макросов гласит:не используйте их до тех пор пока у вас не будет другого выхода. Практически любой макрос свидетельствует о несовершенстве языка программирования, программы или программиста.Основная проблема макросов заключается в том,что они выглядит гораздо привлекательнее,чем являются таковыми на самом деле... Применение макросов внешне походит на имя или вызов функции,но не имеет с ними ничего общего. Макросы негигиеничны в том смысле,что они могут быть раскрыты неожиданно, причем превратиться в зависимости от контекста их использования в самые разные конструкуции.Подстановка текста выполняемая макросами,делает написание хотя бы в небольшой степени приличного макроса смесью исскуства и черной магии."

92
24 мая 2007 года
Тень Пса
2.2K / / 19.10.2006
и на этом я думаю тему можно закончить :)

имхо, аргументов достаточно
370
24 мая 2007 года
koval
443 / / 29.08.2005
Такой бестолковый вопрос, а ответов аж на два листа!!! =)
92
24 мая 2007 года
Тень Пса
2.2K / / 19.10.2006
ну дык если народ свято верит что без #define не обойтись :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог