زبان برنامهنویسی C، برای کمک به مدیریت پروژههای بزرگ و سرعت بخشیدن به عمل ترجمه، اجازه میدهد که ماژولهای جداگانه ترجمه شده برنامهای بزرگ با یکدیگر پیوند داده شوند. لذا باید راهی وجود داشته باشد که فایلهای مربوط به متغیرهای عمومی مورد نیاز، به برنامه گفته شود. برای این کار، همه متغیرهای عمومی در یک فایل توصیف میگردند و در سایر فایلها، آن متغیرها با استفاده از کلمه کلیدی extern توصیف میگردند.
به طور کلی اگر حجم برنامهای بزرگ باشد، میتوان آن را به قسمتهای منطقی کوچکتر به نام ماژول یا واحد تجزیه کرد و هر واحد را در یک فایل جداگانه قرار داد و ترجمه یا تفسیر کرد و سپس آنها را با یکدیگر به اجرا درآورد. در این روش، اگر متغیرهایی را در واحد اصلی تعریف کنیم و بخواهیم از آنها در واحدهای فرعی استفاده کنیم، بدون اینکه در این واحدهای فرعی حافظهای به آنها اختصاص یابد، باید آنها را در این واحدها با کلمه کلیدی extern معرفی کنیم. با این عمل به کامپایلر میگوییم که این متغیرها در جای دیگری، یعنی در واقع در واحد اصلی، تعریف شدهاند؛ یعنی اینها متغیرهای خارجیاند.
مثال در زیر، دو ماژول که جداگانه ترجمه میشوند با استفاده از متغیرهای کلی نشان داده شدهاند.
ملاحظه میکنید که در فایل دوم، لیست متغیرهای عمومی به طور دقیق از فایل اول نسخهبرداری شدهاند، ولی کلمه کلیدی extern در توصیف آنها افزوده شده است. توصیفکننده extern به کامپایلر میگوید که نوع و اسامی این متغیرها در جای دیگری توصیف شدهاند، به عبارت دیگر، extern اجازه میدهد که کامپایلر نوع و اسامی این متغیرهای عمومی را بدون ایجاد دوباره حافظه واقعی برای آنها بشناسد.
وقتی که متغیر عمومی را در درون تابعی در همان فایلی که توصیف متغیرهای عمومی نیز در آن صورت گرفته است به کار میبرید، به استفاده از extern نیازی نیست. مانند متغیر x در func1 و File1 و متغیرهای x , y در func2 و y در func3 از File2.
البته انتخاب extern کمتر متداول است. برای مثال قطعه برنامه زیر کاربرد این گزینش را نشان میدهد.
int first , last ; /* global definition of first and last */
main()
{
extern int first ; /* optional use of the extern declaration */
}
با اینکه توصیف متغیر extern میتواند در داخل همان فایلی که متغیرهای عمومی توصیف شدهاند انجام پذیرد، این کار ضرورتی ندارد، زیرا کامپایلر C وقتی که با متغیری برخورد میکند که توصیف نشده است، کنترل میکند که آیا این متغیر با یکی از متغیرهای عمومی همنام است یا نه و درصورت همنام بودن، آن را متغیر extern درنظر میگیرد.
به هرحال چون متغیرهای خارجی به صورت عمومی تعریف شدهاند، قلمرو آنها از همان محل یا نقطه تعریفشان تا انتهای برنامه است و در بقیه برنامه و همه توابعی که بعد از آن میآیند شناخته شدهاند. بنابراین توسط همه آن توابع در دسترساند. حال چنانچه در هرکدام از این توابع، مقادیری بهاینگونه متغیرها اختصاص داده شود، پس از خروج از آن تابع نیز مقادیر اختصاص داده شده به آن متغیرها باقی خواهد ماند. با استفاده از این خاصیت میتوانیم اطلاعاتی را بدون استفاده از آرگومان به توابع انتقال دهیم. این روش، بویژه در مواردی که تابع مورد نظر به اقلام داده ورودی متعددی نیاز دارد، راهی ساده در اختیار ما قرار میدهد.
به هرحال اگر تعریف تابع قبل از تعریف متغیرهای خارجی بیاید، باید آن متغیرها در تابع مزبور نیز متغیرهای خارجی توصیف گردند. همچنین باید توجه داشت که در توصیف متغیرهای خارجی نمیتوان به آنها مقدار اولیه اختصاص داد. این، یک تفاوت اساسی بین تعریف و توصیف متغیرهای خارجی است؛ یعنی در تعریف متغیرهای خارجی به عنوان متغیرهای عمومی یا global میتوان به آن مقدار اولیه نیز نسبت داد، ولی در توصیف آنها در جای دیگر یا تابع دیگر، بهعنوان متغیر خارجی، اختصاص مقدار اولیه مجاز نیست، ولی بعد میتوان در همان تابع با دستور انتساب یا خواندن، مقادیر دلخواه دیگری به آنها اختصاص داد.
دیدگاهها بسته شدهاند.