Explicitly linking و mingw
-
p{direction:rtl;text-align:right}. این سوال مربوط به کیوت نمیشه ولی اگر کسی میدونه راهنماییم کنه.
برای explicit link کردن ویژوال استودیو فقط type های استاندارد ++c رو ساپورت میکنه. مثلا این یک export قابل قبول با vc نیست:
@extern "C" lib QStringList anything();@p{direction:rtl;text-align:right}. در صورتی که mingw مشکلی با این قضیه نداره و من از این مورد تو چندین پروژه استفاده کردم.
حالا نگرانی من اینجاست که به هرحال این یک استاندارد به ثبت رسیده از طرف مایکروسافته. چه دلیلی میتونه داشته باشه که جلوی این نوع export کردن رو گرفته؟
با وجود اینکه اصرار میکنیم این کار توسط mingw انجام بشه آیا میتونه در مواردی مشکل ساز بشه؟ -
p{direction:rtl;text-align:right}. استاندارد کد بالا مربوط به Microsoft نمیشه. جزو متن استاندارد رسمی ++C هست. در بخش 7.5§ مربوط به استاندارد 2003 نوشته: extern "C" is a linkage-specification بهطور واضح گفته شده که Every compiler is required to provide "C" linkage منتهی پیادهسازی مایکروسافت از این استاندارد ناقص و در موارد زیادی غلط هست. همچنین تو متن استاندارد C++11 قسمت "§7.5.9":http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf توضیحات کاملتری هست.
p{direction:rtl;text-align:right}. کمپانی مایکروسافت طی بیست سال گذشته هیچ کدوم از استانداردهای بینالمللی سی++ رو بهطور کامل پیادهسازی نکرده. برای همینه که من همیشه به همه توصیه میکنم از کامپایلرهای مایکروسافت بههیچعنوان استفاده نکنید مگر در مواقعی که مجبور باشید. این مسأله فقط در مورد کارایی نیست. خیلی از کدهای سی++ که با MSVC کامپایل شده باشه رفتار عجیبی خواهد داشت. هیچ راهی هم برای درک رفتار این کامپایلر وجود نداره چون متنبسته است و مستندات دقیق هم نداره.
-
[quote author="hdeldar" date="1357576671"]p{direction:rtl; text-align:right}. سلام.با @soroush موافقم و این عبارت فقط تو نوع ارسال پاراکتر ها بنظرم تاثیر داره و اگر دو طرف جای که شما می خواهید استفاده کنید MSVC باشه نیازی به گذاشتن فکر نمی کنم باشه[/quote]
p{direction:rtl; text-align:right}. اگه لینکشونده با سی نوشته شده باشه (فرقی نداره چه کامپایلری) اونوقت لینککنندهٔ سی++ مجبوره extern C بده. مستقل از کامپایلر و مستقل از ABI هست.
-
[quote author="Mohsen" date="1357556354"]p{direction:rtl;text-align:right}. extern ساپورت شده ولی فقط برای تایپ های خود c.[/quote]
p{direction:rtl; text-align:right}. این یعنی ساپورت نشده. استاندارد با کسی شوخی نداره، یه ویژگی توی یه کامپایلر یا هست یا نیست. آخر سر یه تیک جلوش میخوره. تیک روبروی C Linkage Mechanism برای MSVC نمیشه زد. متن استاندارد کامل توضیح داده که ویژگیهایی باید برای C Linkage پیادهسازی شده باشه و چه ویژگیهایی نباید پیادهسازی شده باشه. یکی از اینها امکان تعریف انواع دادهٔ non trivial برای لینکشوندهها هست.
-
[quote author="hdeldar" date="1357576671"]سلام.با @soroush موافقم و این عبارت فقط تو نوع ارسال پاراکتر ها بنظرم تاثیر داره و اگر دو طرف جای که شما می خواهید استفاده کنید MSVC باشه نیازی به گذاشتن فکر نمی کنم باشه[/quote]
p{direction:rtl;text-align:right}. بحث این نیست. مساله خروجی گرفتن از نوع داده تعریف نشده برای کامپایلر هست.
مرسی از سروش