#میم
I thought you guys were joking when you said electricity on Linux is optional
🚁 Hicte Blog | (smm)
I thought you guys were joking when you said electricity on Linux is optional
🚁 Hicte Blog | (smm)
1🤣22🔥1😁1🗿1
#سی
تایپ void
نشون میده که هیچ مقداری در دسترس نیست. در نتیجه، نمیشه متغیرها یا ثابتها رو با این نوع تعریف کرد.
میتونین از void برای اهداف زیر استفاده کنین:
- در اعلانهای تابع
تابعی که مقدار بازگشتی نداره. برای مثال:
همچنین کلمه کلیدی void تو لیست پارامترهای تابع نشون میده که تابع هیچ پارامتری نداره. برای مثال:
در نتیجه، اگه سعی کنین از فراخوانی این تابع مثل
استفاده کنین، کامپایلر پیام خطا صادر میکنه.
اگه تابع بدون void تو لیست پارامترها اعلان بشه،
کامپایلر C هیچ اطلاعاتی در مورد پارامترهای تابع نداره و قادر به تشخیص صحیح بودن فراخوانی تابع نمیشه.
یعنی تابع رو با هر پارامتری فراخوانی کنیم هیچ خطایی از سمت کامپایلر دریافت نمیکنیم.
از استاندارد C23 این موضوع تغییر کرده و اگه موقع تعریف تابع پارامترها رو خالی بذاریم کامپایلر در نظر میگیره این تابع با هیچ پارامتری فراخوانی نشه و نیازی به نوشتن void بطور صریح وجود نداره. همونطور که توی C++ بوده.
- عبارات (expressions) از نوع void
عبارت void عبارتیه که هیچ مقداری نداره.
برای مثال فراخوانی یه تابع که مقدار بازگشتی نداره، عبارتی از نوع void هست:
با cast یه عبارت
به طور صریح مقدار عبارت، مثل مقدار بازگشتی یه تابع، حذف میشه:
بعضی از linterها بابت استفاده نکردن از عباراتی که مقداری دارن هشدار میدن که خب با تبدیل صریحش به void به linter اعلام میکنیم آگاهانه نمیخوایم از مقدارش استفادهای کنیم.
بنظرم اگه توابع استاندارد رو فاکتور بگیریم تو بقیهی موارد ممکنه روی خوانایی کد هم تاثیر مثبت بذاره.
- اشارهگر به void
اشارهگری از نوع void * نشون دهندهی آدرس یه آبجکت هست، اما نوع اون رو نشون نمیده.
میشه از این اشارهگرهای بدون نوع برای اعلان توابعی استفاده کرد که میتونن روی انواع مختلف آرگومانها عمل کنن، یا یه اشارهگر چندمنظوره رو برمیگردونن.
مثل توابع استاندارد مدیریت حافظه:
میشه یه مقدار اشارهگر void رو به هر نوع اشارهگر دیگهای اختصاص داد، یا برعکس، بدون تبدیل صریح نوع.
احتمالا توی بعضی از کدهای C دیدین که مقدار بازگردانده شده از تابعی مثل malloc رو بطور صریح به تایپ اشارهگر مورد نظر cast میکنن.
توی C نیازی به تبدیل صریح از void * به انواع دیگه وجود نداره. اما توی C++ باید صراحتا cast رو انجام بدیم.
بعضا در صورت نیاز بخاطر سازگاری کد با کامپایلرهای C++ اینکار رو انجام میدن. گاهی هم افراد صرفا از روی تقلید و عادت اینکار رو میکنن.
🚁 Hicte Blog | (smm)
تایپ void
نشون میده که هیچ مقداری در دسترس نیست. در نتیجه، نمیشه متغیرها یا ثابتها رو با این نوع تعریف کرد.
میتونین از void برای اهداف زیر استفاده کنین:
- در اعلانهای تابع
تابعی که مقدار بازگشتی نداره. برای مثال:
void perror(const char *);
همچنین کلمه کلیدی void تو لیست پارامترهای تابع نشون میده که تابع هیچ پارامتری نداره. برای مثال:
FILE *tmpfile(void);
در نتیجه، اگه سعی کنین از فراخوانی این تابع مثل
tmpfile("name.tmp")استفاده کنین، کامپایلر پیام خطا صادر میکنه.
اگه تابع بدون void تو لیست پارامترها اعلان بشه،
FILE *tmpfile();
کامپایلر C هیچ اطلاعاتی در مورد پارامترهای تابع نداره و قادر به تشخیص صحیح بودن فراخوانی تابع نمیشه.
یعنی تابع رو با هر پارامتری فراخوانی کنیم هیچ خطایی از سمت کامپایلر دریافت نمیکنیم.
از استاندارد C23 این موضوع تغییر کرده و اگه موقع تعریف تابع پارامترها رو خالی بذاریم کامپایلر در نظر میگیره این تابع با هیچ پارامتری فراخوانی نشه و نیازی به نوشتن void بطور صریح وجود نداره. همونطور که توی C++ بوده.
- عبارات (expressions) از نوع void
عبارت void عبارتیه که هیچ مقداری نداره.
برای مثال فراخوانی یه تابع که مقدار بازگشتی نداره، عبارتی از نوع void هست:
char filename[] = "memo.txt";
if (fopen(filename, "r") == NULL) perror(filename); // A void expression
با cast یه عبارت
(void)expressionبه طور صریح مقدار عبارت، مثل مقدار بازگشتی یه تابع، حذف میشه:
(void)printf("I don't need this function's return value!\n");بعضی از linterها بابت استفاده نکردن از عباراتی که مقداری دارن هشدار میدن که خب با تبدیل صریحش به void به linter اعلام میکنیم آگاهانه نمیخوایم از مقدارش استفادهای کنیم.
بنظرم اگه توابع استاندارد رو فاکتور بگیریم تو بقیهی موارد ممکنه روی خوانایی کد هم تاثیر مثبت بذاره.
- اشارهگر به void
اشارهگری از نوع void * نشون دهندهی آدرس یه آبجکت هست، اما نوع اون رو نشون نمیده.
میشه از این اشارهگرهای بدون نوع برای اعلان توابعی استفاده کرد که میتونن روی انواع مختلف آرگومانها عمل کنن، یا یه اشارهگر چندمنظوره رو برمیگردونن.
مثل توابع استاندارد مدیریت حافظه:
void *malloc( size_t size );
void free( void *ptr );
میشه یه مقدار اشارهگر void رو به هر نوع اشارهگر دیگهای اختصاص داد، یا برعکس، بدون تبدیل صریح نوع.
int *int_ptr = malloc(sizeof(int));
float *float_ptr = malloc(sizeof(float));
free(int_ptr);
free(float_ptr);
احتمالا توی بعضی از کدهای C دیدین که مقدار بازگردانده شده از تابعی مثل malloc رو بطور صریح به تایپ اشارهگر مورد نظر cast میکنن.
int *ptr;
ptr = (int*)malloc(sizeof(int));
توی C نیازی به تبدیل صریح از void * به انواع دیگه وجود نداره. اما توی C++ باید صراحتا cast رو انجام بدیم.
بعضا در صورت نیاز بخاطر سازگاری کد با کامپایلرهای C++ اینکار رو انجام میدن. گاهی هم افراد صرفا از روی تقلید و عادت اینکار رو میکنن.
🚁 Hicte Blog | (smm)
🔥5👍2❤1