HICTE Blog
1.13K subscribers
432 photos
140 videos
8 files
687 links
گروهمون: @HicteGroup

دسته بندی پست‌ها: t.me/HicteBlog/743
Download Telegram
🌚12😁6😈2
👍10😁3
#میم

I thought you guys were joking when you said electricity on Linux is optional

🚁 Hicte Blog | (smm)
1🤣22🔥1😁1🗿1
🤣17👍31😁1
😁7🤯1
🤣12🤯6😡4😁1
😁25
This media is not supported in your browser
VIEW IN TELEGRAM
#میم

یوزرای آرچ از دید بقیه

🚁 Hicte Blog | (M M)
🤣27
🤣43🔥1
🤣14
🤣24👍4
😁24😈51🤣1😭1
#سی

تایپ 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👍21
🤣20😁7