-
فرشید پوشنده
1405/05/24
-
24 مرداد 1405
بازگشت به: آموزش برنامه نویسی c++ سی پلاس پلاس
۰.۱۲ — پیکربندی کامپایلر: انتخاب استاندارد زبان
با وجود نسخههای مختلف C++ (C++98، C++03، C++11، C++14، C++17، C++20، C++23 و غیره)، کامپایلر شما چگونه میداند که از کدام یک استفاده کند؟ بهطور کلی، یک کامپایلر یک استاندارد را بهعنوان پیشفرض انتخاب میکند. معمولاً استاندارد پیشفرض، جدیدترین استاندارد زبان نیست — بسیاری از آنها بهطور پیشفرض از C++14 استفاده میکنند که فاقد بسیاری از جدیدترین و بهترین ویژگیها است.
اگر میخواهید از استاندارد زبان متفاوتی استفاده کنید (و احتمالاً چنین خواهید کرد)، باید IDE/کامپایلر خود را برای این کار پیکربندی کنید.
نامهای رایج برای استانداردهای زبان (مانند C++20) بر اساس سال انتشار (یا انتشار مورد انتظار) استاندارد زبان هستند. از آنجایی که سال انتشار تا زمانی که نزدیک نشود، واقعاً مشخص نیست، استانداردهای زبانی که در مراحل اولیه توسعه هستند، گاهی از یک نام توسعهای استفاده میکنند. برای مثال، C++20 همچنین با نام C++2a نیز شناخته میشود.
| سال انتشار | نام رسمی | نام رایج | نام توسعهای | توضیحات |
|---|---|---|---|---|
| ۲۰۱۱ | ISO/IEC 14882:2011 | C++11 | C++0x | |
| ۲۰۱۴ | ISO/IEC 14882:2014 | C++14 | C++1y | |
| ۲۰۱۷ | ISO/IEC 14882:2017 | C++17 | C++1z | |
| ۲۰۲۰ | ISO/IEC 14882:2020 | C++20 | C++2a | |
| ۲۰۲۴ | ISO/IEC 14882:2024 | C++23 | C++2b | نهاییسازی (تکمیل فنی) در سال ۲۰۲۳ |
| نامشخص | نامشخص | C++26 | C++2c |
یک نکتهٔ جانبی…
C++11 نام توسعهای C++0x داشت زیرا در ابتدا انتظار میرفت که پیش از سال ۲۰۱۰ منتشر شود.
کدام استاندارد زبان را باید انتخاب کنید؟
اگر می خوای حرفه ای برنامه نویسی یاد بگیری!
آموزش برنامه نویسی c++
«++C یکی از قدرتمندترین زبانهای برنامهنویسی دنیاست که هم سرعت و کارایی زبان C را دارد و هم امکانات پیشرفتهی شیگرایی را در اختیار میگذارد. با ++C میتوان از ساخت سیستمعاملها و نرمافزارهای سیستمی گرفته تا طراحی بازیهای سهبعدی و پروژههای پیچیدهی صنعتی را انجام داد. یادگیری این زبان مثل داشتن کلید ورود به دنیای عمیقتر کامپیوتر است؛ جایی که میتوانی کنترل کامل روی حافظه، پردازش و ساختار برنامه داشته باشی و ایدههایت را با نهایت قدرت و سرعت به واقعیت تبدیل کنی.»
در محیطهای حرفهای، معمول است که یک استاندارد زبان را انتخاب کنید که یک یا دو نسخه از جدیدترین استاندارد نهاییشده عقبتر باشد (به عنوان مثال، اگر C++20 جدیدترین نسخهٔ نهاییشده باشد، یعنی C++14 یا C++17). این کار معمولاً برای اطمینان از این انجام میشود که سازندگان کامپایلر فرصت داشتهاند تا نقصها را برطرف کنند، و همچنین تا بهترین روشها (Best Practices) برای ویژگیهای جدید به خوبی درک شده باشند. در صورت لزوم، این کار همچنین به اطمینان از سازگاری بهتر بین پلتفرمها کمک میکند، زیرا ممکن است کامپایلرهای روی برخی پلتفرمها پشتیبانی کامل از استانداردهای جدیدتر را بلافاصله ارائه ندهند.
برای پروژههای شخصی و در زمان یادگیری، توصیه میکنیم جدیدترین استاندارد نهاییشده را انتخاب کنید، زیرا انجام این کار ضرر چندانی ندارد.
نکته
بسیاری از کامپایلرها پشتیبانی «آزمایشی» یا «پیشنمایش» را برای ویژگیهای استانداردهای زبان آینده که نهایی نشدهاند، ارائه میدهند. IDE شما ممکن است این را به عنوان یک گزینه در تنظیمات مربوط به پیکربندی استاندارد زبان ارائه دهد، یا ممکن است بتوانید با استفاده از نام رایج یا نام توسعهای استاندارد زبان آینده، آن را بهصورت دستی فعال کنید.
پشتیبانی از ویژگیهای استانداردهای زبان نهایینشده، ناقص و احتمالاً دارای اشکال (Buggy) خواهد بود.
یادداشت نویسنده
این وبسایت در حال حاضر استاندارد C++17 را هدف قرار داده است، به این معنی که درسها و مثالهای ما فرض میکنند کامپایلر شما قابلیت C++17 را دارد. برخی مطالب C++20 و C++23 نیز برای کسانی که کامپایلرهای سازگار دارند، در دسترس است.
برای بهرهمندی کامل از تمام محتوای درسها، توصیه میکنیم از جدیدترین استاندارد زبانی که کامپایلر شما پشتیبانی میکند، استفاده کنید.
اگر کامپایلر شما از C++17 پشتیبانی نمیکند، توصیه میکنیم به کامپایلری ارتقا دهید که این قابلیت را داشته باشد، یا در زمان یادگیری از یک کامپایلر آنلاین که از C++17 یا جدیدتر پشتیبانی میکند، استفاده کنید.
یک یادآوری
هنگام تغییر استاندارد زبان (یا هر تنظیمات پروژه دیگری)، تغییر را برای همه پیکربندیهای ساخت (Build Configurations) اعمال کنید.
تنظیم استاندارد زبان در Visual Studio
در زمان نوشتن این مطلب، Visual Studio 2022 بهطور پیشفرض از قابلیتهای C++14 استفاده میکند که امکان استفاده از ویژگیهای جدیدتر معرفیشده در C++17 و C++20 را نمیدهد.
برای استفاده از این ویژگیهای جدیدتر، باید یک استاندارد زبان جدیدتر را فعال کنید. متأسفانه، در حال حاضر هیچ راهی برای انجام این کار بهصورت سراسری وجود ندارد — شما باید این کار را بهصورت پروژهبهپروژه انجام دهید.
هشدار
در Visual Studio، هر بار که یک پروژه جدید ایجاد میکنید، باید استاندارد زبان خود را دوباره انتخاب کنید.
برای انتخاب استاندارد زبان، پروژه خود را باز کنید، سپس به منوی Project > (نام برنامهتان) Properties بروید، سپس Configuration Properties > C/C++ > Language را باز کنید.
ابتدا مطمئن شوید که Configuration (پیکربندی) روی “All Configurations” (همه پیکربندیها) تنظیم شده است.
از آنجا، میتوانید C++ Language Standard (استاندارد زبان C++) را به نسخهای از C++ که میخواهید استفاده کنید، تنظیم کنید.
نکته
توصیه میکنیم جدیدترین استاندارد، یعنی “ISO C++ Latest (/std:c++latest)” را انتخاب کنید، که اطمینان میدهد میتوانید از تعداد بیشتری از ویژگیهایی که کامپایلر شما پشتیبانی میکند، استفاده کنید.
مطمئن شوید که استاندارد زبان را از منوی کشویی انتخاب میکنید (آن را تایپ نکنید).
مطلب مرتبط
برای اطلاعات بیشتر درباره تنظیمات استاندارد زبان در Visual Studio، مایکروسافت یک سند مرجع استاندارد زبان Visual Studio دارد.
🔗 راهنمای کامل مایکروسافت
طبق مستندات رسمی مایکروسافت، تنظیم استاندارد زبان از طریق پروپرتی C++ Language Standard در مسیر Configuration Properties > C/C++ > Language انجام میشود .
📋 گزینههای استاندارد زبان در MSVC
بر اساس مستندات رسمی، گزینههای موجود عبارتند از :
Default (ISO C++14 Standard): تنظیم پیشفرض کامپایلر MSVC که همان C++14 است.
ISO C++17 Standard (/std:c++17): فعالسازی ویژگیهای استاندارد C++17.
ISO C++20 Standard (/std:c++20): فعالسازی ویژگیهای استاندارد C++20.
Preview – ISO C++23 Standard (/std:c++23preview): پشتیبانی پیشنمایش از ویژگیهای C++23 (قابل تغییر تا زمان نهاییسازی استاندارد) .
Preview – Features from the Latest C++ Working Draft (/std:c++latest): فعالسازی جدیدترین ویژگیهای پیادهسازیشده در پیشنویس استاندارد آینده C++، همراه با برخی ویژگیهای آزمایشی و در حال توسعه .
نکته مهم: تفاوت
/std:c++23previewبا/std:c++latestدر این است که گزینه اول فقط ویژگیهای بخشی از استاندارد C++23 را فعال میکند، در حالی که گزینهlatestشامل ویژگیهای آزمایشی و در حال توسعهای نیز میشود که ممکن است در نسخههای نهایی استاندارد تغییر کنند .
📌 نکته کلیدی درباره __cplusplus
در MSVC، مقدار ماکروی __cplusplus بهطور پیشفرض روی 199711L (مربوط به C++98) باقی میماند. برای دریافت مقدار صحیح مطابق با استاندارد انتخابشده، باید از گزینه /Zc:__cplusplus نیز استفاده کنید .
تنظیم استاندارد زبان در Code::Blocks
Code::Blocks ممکن است بهطور پیشفرض از یک استاندارد زبان قبل از C++11 استفاده کند. قطعاً میخواهید بررسی کنید و مطمئن شوید که یک استاندارد زبان مدرنتر فعال است.
خبر خوب این است که Code::Blocks به شما امکان میدهد استاندارد زبان خود را بهصورت سراسری (Global) تنظیم کنید، بنابراین میتوانید آن را یک بار تنظیم کنید (به جای اینکه بهصورت پروژهبهپروژه انجام دهید). برای این کار، به منوی Settings > Compiler… بروید:
سپس کادرهای انتخابی (Checkboxes) با برچسب Have g++ follow the C++XX ISO C++ language standard [-std=c++XX] را پیدا کنید، که در آن XX یک عدد (مثلاً ۲۰، ۱۷ و غیره) است که نشاندهنده یک استاندارد زبان است:
اگر C++23، C++20 یا C++17 در این لیست ظاهر شد، گزینهای را انتخاب کنید که نشاندهنده جدیدترین استاندارد ISO است (مثلاً Have g++ follow the C++20 ISO language standard را انتخاب کنید). اگر استانداردهای GNU را نیز در این لیست مشاهده کردید، آنها را نادیده بگیرید.
اگر C++17 را در این لیست نمیبینید، به آخرین نسخه Code::Blocks ارتقا دهید.
هشدار
در زمان نگارش این مطلب، نسخه فعلی Code::Blocks (20.03) از یک کامپایلر قدیمی (GCC 8.1.0) استفاده میکند.
توصیه میکنیم با بهروزرسانی MinGW، کامپایلر خود را بهروز کنید. روش انجام این کار را میتوانید در بخش مربوط به Code::Blocks در درس ۰.۶ — نصب محیط توسعه یکپارچه (IDE) پیدا کنید.
نکته
پس از بهروزرسانی به آخرین نسخه MinGW، میتوانید بررسی کنید که آیا کادرهای انتخابی استاندارد زبان جدیدتر در منوی Settings > Compiler… ظاهر میشوند یا خیر. اگر ظاهر نشدند، میتوانید بهصورت دستی یک نسخه C++ را به صورت زیر انتخاب کنید:
برگه “Other compiler options” (سایر گزینههای کامپایلر) را در کادر محاورهای “Global Compiler Settings” (تنظیمات سراسری کامپایلر) پیدا کنید.
یکی از گزینههای کامپایلر زیر را اضافه کنید:
-std=c++11،-std=c++14،-std=c++17،-std=c++20، یا-std=c++23(به ترتیب برای فعالسازی پشتیبانی از C++11/14/17/20/23). همچنین میتوانید نام کد جدیدترین نسخه (مثلاً-std=c++2c) را برای پشتیبانی آزمایشی از ویژگیهای استاندارد زبان آینده امتحان کنید.
تنظیم استاندارد زبان در GCC/G++/Clang
برای GCC/G++/Clang، میتوانید از گزینههای کامپایلر -std=c++11، -std=c++14، -std=c++17، -std=c++20، یا -std=c++23 استفاده کنید (به ترتیب برای فعالسازی پشتیبانی از C++11/14/17/20/23). اگر GCC نسخه ۸ یا ۹ دارید، برای پشتیبانی از C++20 باید به جای آن از -std=c++2a استفاده کنید. همچنین میتوانید جدیدترین نام کد (مثلاً -std=c++2c) را برای پشتیبانی آزمایشی از ویژگیهای استاندارد زبان آینده امتحان کنید.
تنظیم استاندارد زبان برای VS Code
برای VS Code، میتوانید قوانین بالا برای تنظیم استاندارد زبان در GCC/G++/Clang را دنبال کنید.
گزینه استاندارد زبان مناسب (شامل گیومههای دوتایی و ویرگول) را در فایل پیکربندی tasks.json، در بخش "args"، در یک خط جداگانه قبل از "${file}" قرار دهید.
همچنین میخواهیم Intellisense را پیکربندی کنیم تا از همان استاندارد زبان استفاده کند. برای C++20، در settings.json، تنظیم زیر را تغییر دهید یا اضافه کنید (در یک خط جداگانه):
"C_Cpp.default.cppStandard": "c++20"کامپایلر من در حال حاضر از چه استاندارد زبانی استفاده میکند؟
این مطلب به درس بعدی منتقل شده است. به بخش ۰.۱۳ — کامپایلر من از چه استاندارد زبانی استفاده میکند؟ مراجعه کنید.
صادر کردن پیکربندی (Exporting your Configuration)
اینکه هر بار که یک پروژه جدید ایجاد میکنید، مجبور باشید همه گزینههای تنظیمات خود را دوباره انتخاب کنید، خستهکننده است. خوشبختانه، بیشتر IDEها راهی برای صادر کردن تنظیمات شما فراهم میکنند. این کار معمولاً با ایجاد یک قالب پروژه (Project Template) جدید با تنظیمات مورد نظر شما انجام میشود، و سپس هنگام ایجاد یک پروژه جدید، آن قالب پروژه را انتخاب میکنید.
برای کاربران Visual Studio
در Visual Studio، این گزینه از طریق Project -> Export Template (صادر کردن قالب) در دسترس است. “Project template” (قالب پروژه) را انتخاب کنید، یک نام و توضیح اختیاری اضافه کنید (به عنوان مثال، “C++20 console application” – برنامه کنسولی C++20)، و سپس روی “Finish” (پایان) کلیک کنید.
دفعه بعد که یک پروژه جدید ایجاد میکنید، این قالب را در لیست قالبهای پروژه خود مشاهده خواهید کرد.
هنگامی که با این قالب یک پروژه جدید ایجاد میکنید، ممکن است هیچ فایلی را باز نکند. میتوانید فایل .cpp خود را در پنجره Solution Explorer با رفتن به مسیر Solution -> <Project Name> -> Source Files -> <template name>.cpp باز کنید.
فوریه ۲۰۲۵: خواننده، Mingtao Yue با مهربانی نظری را به جای گذاشت که راهحلهایی را برای چند اشکال (Bug) در این ویژگی ارائه میدهد.
برای کاربران Code::Blocks
در Code::Blocks، گزینه File -> Save project as template (ذخیره پروژه به عنوان قالب) را انتخاب کنید. به قالب خود یک عنوان بدهید و آن را ذخیره کنید.
وقتی یک پروژه جدید ایجاد میکنید، این قالب را در زیر گزینه “User templates” (قالبهای کاربر) پیدا خواهید کرد.
از کجا میتوانم سند استاندارد C++ را مشاهده کنم؟
هر استاندارد زبان C++ توسط یک سند استاندارد (Standards Document) توصیف میشود، که یک سند فنی رسمی است و منبع معتبر برای قوانین و الزامات یک استاندارد زبانی خاص محسوب میشود. سند استاندارد برای یادگیری طراحی نشده است — بلکه برای نویسندگان کامپایلر طراحی شده است تا بتوانند استانداردهای جدید زبان را به دقت پیادهسازی کنند. گاهی اوقات میبینید که افراد هنگام توضیح نحوه عملکرد چیزی، از سند استاندارد نقل قول میکنند.
سند استاندارد C++ تأییدشده برای یک استاندارد زبانی خاص بهصورت رایگان در دسترس نیست. لینکی برای خرید جدیدترین استاندارد در اینجا وجود دارد.
هنگامی که یک استاندارد زبان جدید در حال توسعه است، پیشنویسهای سند استاندارد برای بررسی منتشر میشوند. این پیشنویسها بهصورت آنلاین و رایگان در دسترس هستند. آخرین پیشنویس استاندارد قبل از استاندارد تأییدشده، معمولاً به اندازه کافی به استاندارد رسمی نزدیک است که برای اکثر اهداف قابل استفاده باشد. میتوانید پیشنویسهای استاندارد را در اینجا پیدا کنید.
کامپایلرها اغلب پشتیبانی ناقصی از ویژگیهای جدید زبان دارند
حتی پس از نهاییشدن یک استاندارد زبان، کامپایلرهایی که از آن استاندارد زبان پشتیبانی میکنند، اغلب هنوز پشتیبانیهای缺失، ناقص یا همراه با اشکال (Buggy) برای ویژگیهای خاص دارند.
اگر سعی کنید برنامهای را کامپایل کنید که باید کامپایل شود اما بهطور مرموزی کامپایل نمیشود، به احتمال زیاد به یکی از دو دلیل زیر است:
۱. کامپایلر شما برای استفاده از یک استاندارد زبان قدیمیتر پیکربندی شده است که از ویژگی مورد استفاده شما پشتیبانی نمیکند. سعی کنید یک استاندارد زبان جدیدتر را انتخاب کرده و برنامه خود را دوباره کامپایل کنید. میتوانید از برنامه موجود در درس ۰.۱۳ — کامپایلر من از چه استاندارد زبانی استفاده میکند؟ برای تأیید اینکه انتخاب استاندارد زبان خود را به درستی پیکربندی کردهاید، استفاده کنید.
۲. نسخه کامپایلری که اجرا میکنید ممکن است پشتیبانی缺失، ناقص یا همراه با اشکال برای ویژگی مورد استفاده شما داشته باشد.
وبسایت CPPReference پشتیبانی کامپایلر را برای هر ویژگی به ازای هر استاندارد زبان پیگیری میکند. میتوانید این جداول پشتیبانی را از صفحه اصلی آنها، در بالا سمت راست، زیر “Compiler Support” (پشتیبانی کامپایلر) (بر اساس استاندارد زبان) پیدا کنید. برای مثال، میتوانید ببینید که کدام ویژگیهای C++23 در اینجا پشتیبانی میشوند.
اگر نسخه جدیدتر کامپایلر شما از ویژگی مشکلدار پشتیبانی میکند، میتوانید کامپایلر خود را به آخرین نسخه ارتقا دهید و دوباره سعی کنید برنامه خود را کامپایل کنید. اگر آخرین نسخه کامپایلر شما هنوز از ویژگی مورد نظر شما پشتیبانی نمیکند، میتوانید یا کامپایلر دیگری را امتحان کنید که پشتیبانی ارائه میدهد، یا راهحلی را با استفاده از مجموعهای متفاوت از ویژگیها پیدا کنید.