قبل از هر چیزی، ذکر این موضوع لازمه که در پاسخ به سوالات مطرح شده در این نوشتار، مقداری از طنز و خوشمزه بازی استفاده شده.

حدود چند هفته پیش در محل کار، با یکی از همکاران این بحث پیش اومد که آیا در بدنه structها در ++C می‌توان به تعریف توابع پرداخت یا خیر. هر چند که همکارم با وجود ادعایی که درباره میزان آشنایی خودش با زبان‌های برنامه نویسی مختلف داره، از وجود همچین قابلیتی در ++C مطلع نبود، بلکه حتی وقتی که وی قصد داشت تا کدی برای اثبات این موضوع که نمی‌توان در ++C داخل structها تابع تعریف کرد، بنویسد، کد خود را بدون کاراکتری دخل و تصرف به شکل زیر آغاز کرد!

void main()

واقعا دیگه حتی برام مقدور نیست که کوچکترین خیال پردازی یا تصوری در مورد میزان آشنایی این همکارم حتی با پیش پا افتاده‌ترین قابلیت‌های زبان‌های برنامه نویسی داشته باشم. اما موضوع اساسیی که اینجا مطرح می‌شه و ممکنه برای خیلی‌های دیگه هم مورد سوال باشه و یا ایجاد سردرگمی کنه، اینکه، کدوم یکی از برنامه‌های زیر درست هستند؟ اولی یا دومی؟

int main()
{
   return 0;
}

و یا

void main(
{
   // Code goes here...
}

۱ قطعا اولین سوالی که مطرح میشه مربوط به تفاوت بین ()int main و ()void main میشه!

جواب خیلی ساده است! اگر دم دست من باشید، استفاده از یکی از این دو، به قیمت جونتون تموم میشه.

۲ احتمالا حالا به این فکر می‌کنید اگر از هر دو روش میشه استفاده کرد، پس حتما تفاوتی وجود داره؛ ولی خب… این تفاوت قراره به قیمت جونمون تموم شه… پس حالا کدوم بهتره؟ و چرا؟

باید در نظر داشته باشیم که سوال پرسیدن در مورد مزیت یکی از ین دو روش به دیگری به هیچ وجه درست نیست، بلکه سوال اصلی و موضوع مورد بحت سر این دو روش، بر سر مجاز بودن یکی از این روش‌هاست.

تاکید می‌کنم که تنها ()int main طبق استاندارد C و ++C مجازه.

۳ قطعا افرادی پیدا می‌شن که بگن، پس چرا بعضی از کامپیالرها اجازه به استفاده از ()void main میدن؟

جواب این سوال هم ساده است، مشکل از جاییست که متاسفانه هنوز جایی در استاندارهای C و ++C اجازه تیراندازی به نویسندگان همچین دست از کامپایلرهایی داده نشده.

مورد بعدی هم راجع به استفاده از برنامه‌های به شکل زیره:

int main(
{
   // No return statement...
}

راجع به این روش و استفاده از ()int main بدون برگردوندن یک مقدار عددی صحیح هم این نکته وجود داره که بعضی از کامپیالرها در شرایطی که شما عبارت ;return x رو جا انداخته باشید، به طور اتوماتیک این عبارت رو به انتهای تابع main برنامه اضافه می‌کنند، اما هم کسی که این خط رو جا می‌ندازه و هم نویسنده کامپیالری که زیر سیبیلی این موضوع رو رد می‌کنه رو هم، باز باید مجازات کرد.

در واقع طبق استاندارد ANSI برای C و طبق استاندارد ISO برای ++C این موضوع محلی از بحث نداره و مختومه است، ولی اگر کسی علاقه به مشاهده مثالی داشت، که در اون، استفاده از ()void main در یک برنامه، باعث بروز مشکلاتی میشه، می‌تونه به اینجا سر بزنه.