Необходимость #define
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;
}
ENUM_SERVICE_STATUS Status[SIZE_BUF];
!!!
const int size = 10;int buf[size+10];
В чистом си такая операция недопустима,а в си++ вполне допустима.
а #define это Сишный стиль, тупая замена в коде программы (x_000 и e1vin правы), если уж пишем на С++, то пользуем const (то бишь ответ на вопрос автора: "Никакой!" :) )
#define flase false
:)
а #define это Сишный стиль, тупая замена в коде программы (x_000 и e1vin правы), если уж пишем на С++, то пользуем const (то бишь ответ на вопрос автора: "Никакой!" :) )
а как же ты тогда при помощи констант сделаешь точ то делают:
#IFDEF, #IFNDEF ??
Насколько я читал Мсдн, то пришел к выводу, что хоть #define и берет сове начало еще в С, но это не делает их не частью стандарта С++. Во-первых const - задается еще на этапе компиляции программы, а #define - препроцессорная директива. Так что разница - огромная!!
как бы на вопрос и ответил )
#IFDEF, #IFNDEF - согласен, не заменишь :) они нужны
а как же ты тогда при помощи констант сделаешь точ то делают:
#IFDEF, #IFNDEF ??
Это директивы условной компиляции. Соответственно, DEFINE следует использовать ТОЛЬКО для объявления значений, используемых в этом действии
#IF (ARSIZE > 1024)
// Код для обработки массива с размером больше 1024
#ELSE
// Код для обработки массива с размером меньше или равно 1024
#ENDIF
Всё. В любых других случаях используем const int или enum.
В первом случае при запуске программы создаётся объект константы. Во втором компилятор производит замену имени на значение
#IF (ARSIZE > 1024)
// Код для обработки массива с размером больше 1024
#ELSE
// Код для обработки массива с размером меньше или равно 1024
#ENDIF
Всё. В любых других случаях используем const int или enum.
В первом случае при запуске программы создаётся объект константы. Во втором компилятор производит замену имени на значение
Вы глубоко заблуждаетесь. Откроем мсдн, на страничке посвященой оператору #define.
Итак, что мы там можем прочитать? Цитата:
и пример из того же мсдна:
#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 можна использовать для определения макросов!
в макросах не проводится проверка на совместимость типов подставляемых значений... ну и в конце концов можно вместо макросов использовать inline функции )
[FONT=Times New Roman]В отличие от #define макросов, встроенные (inline) функции неподвержены известным ошибкам двойного вычисления, поскольку каждый аргумент встроенной функции вычисляется только один раз. Другими словами, вызов встроенной функции - это то же самое что и вызов обычной функции, только быстрее:[/FONT]
[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 лучше не использовать, если в этом нет супернеобходимости :)
Предисловие автора к русскому изданию стр.26
,встроенные функции и константы.Точно так же,широкое использование приведений типов в любом языке свидетельствует о плохом проектировании.Как макросы,так и приведения являются частыми источниками ошибок. Тот факт,что без них можно обойтись делает программирование на С++ куда более безопасным и элегантным."
глава 1 пукт 1.6.1 стр.50.
Далее смотрим "Стандарты программирования на С++" Герба Саттера и Андрея Александреску. правило 16 стр.44
его!...Первое правило по применению макросов гласит:не используйте их до тех пор пока у вас не будет другого выхода. Практически любой макрос свидетельствует о несовершенстве языка программирования, программы или программиста.Основная проблема макросов заключается в том,что они выглядит гораздо привлекательнее,чем являются таковыми на самом деле... Применение макросов внешне походит на имя или вызов функции,но не имеет с ними ничего общего. Макросы негигиеничны в том смысле,что они могут быть раскрыты неожиданно, причем превратиться в зависимости от контекста их использования в самые разные конструкуции.Подстановка текста выполняемая макросами,делает написание хотя бы в небольшой степени приличного макроса смесью исскуства и черной магии."
имхо, аргументов достаточно