PDA

View Full Version : توضیح در مورد ساختار extern



alamate_aoal
یک شنبه 22 شهریور 1388, 05:37 صبح
با عرض سلام
کسی از دوستان میتونه با یه مثال ساده کاربرد این دستور رو توضیح بده؟
آیا برای زبان c هست یا ++c ؟

Saeed_m_Farid
یک شنبه 22 شهریور 1388, 08:27 صبح
سلام
برای هردوی C++‎‎‎/C هست، این keyword اگه قبل نام یه متغیر قرار بگیره به کامپایلر میفهمونه که این متغیر یه پیوند خارجی داره، پیوند خارجی (external linkage) یعنی اینکه آبجکت (اینجا متغیر) موردنظر خارج از فایل خودش قابل رویت هست.
عموماً extern به کامپایلر نوع متغیر رو میگه، ولی هیچ فضایی برای اون متغیر اختصاص نمیده، پس شما باید هر جا میخواهید اونو استفاده کنید تعریفش کنید، بنابراین extern معمولاً جاهایی استفاده میشه که میخواهید یه متغیر برای چند تا فایل مجزا قابل اشتراک باشه :

File 1

int GlobalVariable; // implicit definition

void SomeFunction(); // function prototype (declaration)

int main() {
GlobalVariable = 1;
SomeFunction();
return 0;
}



File 2



extern int GlobalVariable; // explicit declaration


void SomeFunction() { // function header (definition)
++GlobalVariable;
}




برای توضیحات بیشتر :


Using extern to Specify Linkage (http://msdn.microsoft.com/en-us/library/0603949d(VS.80).aspx)

hoax3r
یک شنبه 22 شهریور 1388, 10:50 صبح
extern "C" با extern فرق داره extern "C" فقط در کامپایلر های ++C تعریف شده است
در ++C بخاطر وجود توابع اورلود شده و هم نام روشی وجود داره به نام Name Mangling که
نام تابع و توابع آن به شکل خاصی برای لینکر تعریف میشه که این روش هم در هر کامپایلر متفاوته
برای اینکه این قابلیت برای یک تابع غیر فعال بشه از extern "C" قبل تابع استفاده میشه

Nima_NF
یک شنبه 22 شهریور 1388, 12:36 عصر
در ادامه توضیحات پست قبلی،
بیشترین کاربرد extern C زمانی هست که می خواهید با ++C یک کتابخانه بنویسید که باید با هر دو زبان C و ++C سازگار باشد، لذا از آنجایی که در C توابع همنام نمی توانند وجود داشته باشند قبل از تعریف تابع آن را می نویسیم تا به کامپایلر بگوییم موارد بعدی آن C هستند :




extern "C" int myFunc( int x )
{
// so something

return x;
}


در مورد هدر فایل ها و غیره هم همین طور هست، می گوییم موارد C هستند.


ضمنا لینکی که در پست دوم داده شد درست هست، اما توضیحات و مثال مربوط به extern تنها بود.

Saeed_m_Farid
یک شنبه 22 شهریور 1388, 13:35 عصر
بنده منظور دوستمون رو درست متوجه نشدم، احساس کردم extern در C منظورشون هست.
فرمایشات اساتید کاملاً درست هست...

alamate_aoal
شنبه 28 شهریور 1388, 00:55 صبح
کسی از دوستان میتونه این قطعه کدها رو آنالیز کنه:



#ifdef __cplusplus
extern "C" {
#endif
.
.
.
.
#ifdef __cplusplus
}
#endif

alamate_aoal
شنبه 28 شهریور 1388, 00:58 صبح
در ادامه توضیحات پست قبلی،
بیشترین کاربرد extern C زمانی هست که می خواهید با ++C یک کتابخانه بنویسید که باید با هر دو زبان C و ++C سازگار باشد، لذا از آنجایی که در C توابع همنام نمی توانند وجود داشته باشند قبل از تعریف تابع آن را می نویسیم تا به کامپایلر بگوییم موارد بعدی آن C هستند :




extern "C" int myFunc( int x )
{
// so something

return x;
}


در مورد هدر فایل ها و غیره هم همین طور هست، می گوییم موارد C هستند.


ضمنا لینکی که در پست دوم داده شد درست هست، اما توضیحات و مثال مربوط به extern تنها بود.



منظورتان از می گوییم موارد C هستند چیه؟