Men ba'zi kodlarni teskari muhandislik qildim va bunga duch keldim ...
/************************************************************************/
/* */
/* 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); \
}
Asosan, ushbu fayldagi muayyan funktsiyalar to'plami, natijada xatolik mavjudligini tekshirish uchun (c-o'qish) qilganda buni chaqiradi. Ularda EOF uchun ham xuddi shunday tekshiruv bor... Asosan aytishim mumkinki, ular bir nechta joylarda o'z funksiyalarining o'rtasida xatolik qaytarilishini kiritish uchun shunday qilishmoqda.
e.g.
/* 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");
Endi men c/c++ dasturlashiga qaytyapman va men hech qachon makrolardan ko'p foydalanmaganman, lekin bu makro suiiste'molmi?
Men buni o'qidim... C++ makroslari qachon foydali?
... va bu hech qanday kosher misoliga o'xshamaydi, shuning uchun mening taxminim "HA" bo'ladi. Lekin men shunchaki bilimli taxminlar qilishdan ko'ra ko'proq ma'lumotga ega bo'lishni xohlardim ... :)
...errr, qandaydir o'rashni qo'llash yaxshiroq emasmi?
size_t checked_fread(void *buffer, size_t itemsize, size_t numitems, FILE *fp, const char *msg)
funksiyasini yozish va undan izchil foydalanish yaxshiroq bo'lar edi. Nima uchun -1 ga qarshi tekshirilayotgani haqida taxmin qilish ham qiziq;fread()
0 yoki xatoning qisqa hisobini qaytaradi - va qaytarish turisize_t
bo'lib, deyarli barcha maqsadlar uchun -1 qaytish qiymatini istisno qiladi. - person Jonathan Leffler   schedule 02.09.2010fread()
haqidagi sharhlarread()
ga tegishli emas. Biz CHECK_FEOF() ni ko'ra olmaganimiz uchun bu nima qilishini ayta olmaymiz. Biroq, menimcha, ikkala shartni ham boshqarish uchun oddiy funksiya yaxshiroq bo'lardi: uread()
funksiyasini (tizim chaqiruvi) o'rashi va xato holatini hamma narsadan ajratishi mumkin:if ((retval = wrapped_read(fd, &input_integer, sizeof(int32), "reading a 4")) != DCD_NOERROR) return retval;
. Va agar 4 uchun test keng tarqalgan bo'lsa, men buni yana davom ettiraman. Menimcha, bu makro suiiste'mol. - person Jonathan Leffler   schedule 02.09.2010