Я переработал какой-то код и наткнулся на это...
/************************************************************************/
/* */
/* 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/С++, и я никогда не использовал макрос, в первую очередь, но это злоупотребление макросами?
Я прочитал это... Когда макросы С++ полезны?
... и это не похоже на любой из кошерных примеров, поэтому я предполагаю, что это будет "ДА". Но я хотел получить более информированное мнение, а не просто давать обоснованные догадки...:)
... errr, не лучше ли использовать какую-то упаковку?