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

رفع مشکل مقدار بازگشتی ماکروی 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++

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

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


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

توی تنظیمات نباید ست بشه که استاندارد کامپایل 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

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


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

به گفتگو ملحق شوید

شما همین الآن می‌توانید مطلبی را ارسال و بعداً ثبت‌نام کنید. اگر حساب کاربری دارید، و با حساب کاربری خود مطلب ارسال کنید.
نکته: مطلب شما قبل از انتشار نیاز به بازبینی توسط میانجی‌گر‌ها دارد.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


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

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

×
×
  • جدید...