PDA

View Full Version : سوال: موارد استفاده Language Linkage چیست؟



fshb_ 1370
شنبه 22 آبان 1389, 14: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, 15: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 هستش.

موفق باشید.