Я произвел обратный инжиниринг некоторого кода и натолкнулся на это ...
/************************************************************************/
/* */
/* MACRO CHECK_FREAD */
/* */
/* CHECK_FREAD is used to check the status of a file read. It */
/* is passed the return code from read and a string to print out if */
/* an error is detected. If an error is found, an error message is */
/* printed out and the program terminates. This was made into a */
/* macro because it had to be done over and over and over . . . */
/* */
/************************************************************************/
#define CHECK_FREAD(X, msg) if (X==-1) \
{ \
return(DCD_BADREAD); \
}
По сути, определенный набор функций в этом файле вызывает это всякий раз, когда они выполняют (c-read), чтобы проверить результат для ошибка. У них также есть аналогичная проверка для EOF ... По сути, насколько я могу судить, они делают это таким образом, чтобы вставлять возвращаемые значения ошибки в середине их функции в кучу мест.
Например,
/* Read in an 4 */
ret_val = read(fd, &input_integer, sizeof(int32));
CHECK_FREAD(ret_val, "reading an 4");
CHECK_FEOF(ret_val, "reading an 4");
if (input_integer != 4)
{
return(DCD_BADFORMAT);
}
/* Read in the number of atoms */
ret_val = read(fd, &input_integer, sizeof(int32));
*N = input_integer;
CHECK_FREAD(ret_val, "reading number of atoms");
CHECK_FEOF(ret_val, "reading number of atoms");
Теперь я только возвращаюсь к программированию на c / c ++, и я никогда прежде не использовал макро очень, но это злоупотребление макросами?
Я читал это ... Когда полезны макросы C ++?
... и это не похоже ни на один из кошерных примеров, поэтому я думаю, что "ДА". Но я хотел получить более информированное мнение, а не просто делать обоснованные предположения ...:)
... э-э-э, не лучше ли было бы использовать какую-то упаковку?