View Full Version : سوال: موارد استفاده Language Linkage چیست؟
fshb_ 1370
شنبه 22 آبان 1389, 15:34 عصر
سلام
این 3 خط کد چه کاری میکنه؟ یعنی چی که اولی c رو به عنوان language linkage استفاده میکنه؟
extern "C" void spiff(int); // use C protocol for name look-up
extern void spoff(int); // use C++ protocol for name look-up
extern "C++" void spaff(int); // use C++ protocol for name look-up
پیشاپیش ممنون
mehdi.mousavi
شنبه 22 آبان 1389, 16:21 عصر
سلام
این 3 خط کد چه کاری میکنه؟ یعنی چی که اولی c رو به عنوان language linkage استفاده میکنه؟
extern "C" void spiff(int); // use C protocol for name look-up
extern void spoff(int); // use C++ protocol for name look-up
extern "C++" void spaff(int); // use C++ protocol for name look-up
پیشاپیش ممنون
سلام.
در C هر تابعی می تونه یکبار تکرار بشه، در صورتیکه در C++ میتونه Overload های متفاوتی داشته باشه. از طرفی، Linker نیاز به Symbolic Name های مجزا برای نامگذاری هر تابع داره و باید بتونه هر تابع (جدا از اینکه Overload شده باشه یا نه) رو با نام Unique ای آدرس کنه. قوانین نام گذاری در C ساده هستن، چون هر تابع فقط میتونه یکبار در برنامه وجود داشته باشه. اما در C++، تولید این Symbolic Name ها پیچیده تر هستش....
حالا شرایطی رو فرض کنید که می خواهید تابعی که در C کامپایل شده و Symbolic Name ای بر اساس قوانین C بهش اختصاص پیدا کرده رو، در C++ فراخوانی کنید. باید یه طوری به Linker بفهمونید که تابعی که دارید فراخوانی می کنید، بر اساس قوانین نامگذاری توابع C نامگذاری شده، بنابراین سعی نکنه که دنبال تابعی بگرده که بر اساس Symbolic Name های C++ نامگذاری شده.
برای این منظور از
extern "C" void spiff(int);
استفاده می کنیم. بدین ترتیب Compiler میدونه که Symbolic Name تولید شده برای تابع Spiff باید بر اساس قوانین نامگذاری توابع در C نامگذاری بشه (که بهش میگن C Linkage) و میدونه که دنبال چه اسمی باید برای فراخوانی صحیح این تابع بگرده.
به همین ترتیب، اون دو خط کد دیگه که نوشته اید یکسان هستن و نشون میدن که باید از CPP Linkage برای نام گذاری Symbolic Name ها استفاده بشه. همه این کارها هم بخاطر پرهیز از Name Mangling هستش.
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.