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

رفع مشکل مقدار بازگشتی ماکروی cplusplus__


پست های پیشنهاد شده

سلام، مدتی بود که نسخه‌ی ۲۰۱۷ کامپایلر MSVC با مشکل عدم بازگشت مقدار صحیح از نسخه‌ی استاندارد زبان مواجه بود. هرچند توسط توسعه دهندگان این مشکل به مایکروسافت گزارش داده شده بود اما ظاهراً مشکل همچنان پا برجاست.

و اما مشکل، کد زیر را با کامپایلر MSVC2017 اجرا کنید:

#include <iostream>

int main()
{
	std::cout << __cplusplus << std::endl;
	std::cin.get();
	return 0;
}

اگر دقت کنید مقدار بازگشتی این کد 199711خواهد بود. در حالی که باید  مقدار بازگشتی آن با توجه به استاندارد زبان باید یکی از دو مقدار 201402L یا 201403 باشد. برای حل این مورد من پچی را فراهم کردم که می‌تونید این مشکل رو حل کنید. علاوه بر این یک سری ماکرو نویسی جزئی انجام شده که با دقت بیشتر و مقدار بازگشتی از نام خود کامپایلر را برای شما ارائه دهد.

طبق اصلاحیه کد دستوری آن به صورت زیر خواهد که تکه‌ای از کد‌های یکی از پروژه‌های من به نام Genesis بود که حالا اینجا به اشتراک گذاشتمش:

#include <iostream>

using namespace std;

#include "macro.h"

int main()
{
    Macro mc;
    cout << "Hello World!" << endl;
    cout << "C++ Standard Version (MSVC) : " << __cplusplus << endl;
    cout << "C++ Standard Version (with bug fix in MSVC : " << __GENESIS_CPP_VALUE__ << endl;
    cout << "C++ Standard Version (with bug fix in MSVC using function: " << mc.get__cplusplus(false) << endl;
    cout << "Compiler name using flag true: " << mc.get__cplusplus(true) << endl;
    return 0;
}

خروجی:

Hello World!
C++ Standard Version (MSVC) : 199711
C++ Standard Version (with bug fix in MSVC : 201703
C++ Standard Version (with bug fix in MSVC using function: 201703
Compiler name using flag true: MSVC++

برای دریافت این اصلاحیه به مخزن آن مراجعه نمایید.

  • پسندیدن 4

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

توی تنظیمات نباید ست بشه که استاندارد کامپایل C++11 هست؟ یعنی پیش‌فرض‌ش C++98 هست یا صرفاً پیاده‌سازی ماکرو باگ داره؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 33 دقیقه قبل، سروش ربیعی گفته است :

توی تنظیمات نباید ست بشه که استاندارد کامپایل C++11 هست؟ یعنی پیش‌فرض‌ش C++98 هست یا صرفاً پیاده‌سازی ماکرو باگ داره؟

قبلاً گزارشی در مورد این مشکل داده شده که در این بخش خیلی‌ها بهش تاکید کردن، منم به گزارش خطا رو ارسال کردم.

مشکل صرفاً به مقدار بازگشتی ماکرو مربوط بود که تو هر تنظیماتی مثل (/std:c++latest /Zc) مقدار 199711L رو میداد. بر اساس گزارش حل شده‌ای که دادن احتمالاً در نسخه‌های اخیر حل شده باشه اما بعید می‌دونم به صورت پیشفرض و با همین تنظیمات استاندارد مشکلش حل شده باشه چون نتیجه‌ای ازش نگرفتم.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در در 16 آذر 1397 در 13:57، کامبیز اسدزاده گفته است :

قبلاً گزارشی در مورد این مشکل داده شده که در این بخش خیلی‌ها بهش تاکید کردن، منم به گزارش خطا رو ارسال کردم.

مشکل صرفاً به مقدار بازگشتی ماکرو مربوط بود که تو هر تنظیماتی مثل (/std:c++latest /Zc) مقدار 199711L رو میداد. بر اساس گزارش حل شده‌ای که دادن احتمالاً در نسخه‌های اخیر حل شده باشه اما بعید می‌دونم به صورت پیشفرض و با همین تنظیمات استاندارد مشکلش حل شده باشه چون نتیجه‌ای ازش نگرفتم.

امروز با نصب Visual Studio 2019 Final Release متوجه شدم با اینکه تایید کرده بودن این مسئله به صورت کامل حل شده، اما باید بگیم هنوز این مشکل پابرجاست و نتیجش اشاره به ۱۹۹۷۱۱ داره، حتی با تنظیمات بر روی استاندارد ۱۷ و ۱۴ هم همین مشکل موجوده! جالب اینجاست با وجود امکان انتخاب آخرین پیش‌نویسه حتی یکی از ویژگی‌های موجود در نسخه‌ی 2a حتی برای آزمایش پشتیبانی نمی‌شه! به هر حال پیشنهاد این هست کامپایلر کلنگ رو بر روی محیط توسعه‌ی خود پیکربندی کنید تا با مشکلات این چنینی مواجه نشوید.

image.png

image.png

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×