زبان برنامه نویسی سی/پیش پردازنده‌های دیگر

ویکی‎کتاب، کتابخانهٔ آزاد

به غیر از پیش پردازنده‌هایی که نوشتیم ، دستورات مستقیم یا همان پیش پردازنده های دیگری نیز وجود دارند که آگاهی شما از بعضی از آنها ضروری است اما برخی دیگر پیشرفته هستند و فقط در برنامه‌نویسی حرفه‌ای به کار می‌روند . دستور include به معنی « شامل شدن » برای تفهمیم شما به کامپایلر می‌باشد تا یک فایل سرآیند ( header file ) یا فایل برنامه ( با پسوند c. ) را ضمیمه متن برنامه خود نمائید ( برخی دستورات مستقیم نیز مختص کامپایلر شما هستند که برای آگاهی از آنها به راهنمای کامپایلر خود مراجعه کنید )

فایل‌های سرآیند فایل‌های برنامه سی هستند و همواره دارای پسوند h می باشند مثلاً stdio.h ؛ برخی از آنها استاندارد هستند و کامپایلر شما مطمئناً آن را در کتابخانه خود دارد و یا اینکه افزونه هستند و کامپایلر شما جهت سهولت در برنامه‌نویسی برخی فایل های سرآیند را نیز به کتابخانه خود افزوده که در این صورت باید از راهنمای کامپایلر خود بهره بگیرید تا بدانید که چه فایل های سرآیندی را به همراه دارد و چه تابع‌ها و ماکروهایی در آنها تعریف شده‌اند . علاوه بر این شما خودتان نیز مجازید تا فایل سرآیند بنویسید و بعد از نوشتن کد های خودتان در فایل مورد نظر ، آن را به برنامه ضمیمه نمائید . فایل های سرآیند استاندارد ، دارای مجموعه ای ماکروها و یا توابع هستند ( که به آنها توابع کتابخانه‌ای می‌گوئیم ) . زمانی که شما فایل سرآیندی را ضمیمه متن برنامه خود نمائید ، در صورت نوشتن تابع‌ها و یا ماکروهای تعریف شده در آنها مجاز و مجبور به استفاده از آنها خواهید بود و دیگر نمی‌توانید شناسه‌ای را با همان نام تابع یا ماکروی تعریف شده در فایل سرآیند ، تعریف کنید . همچنین اگر ضمیمه ننمائید ( مثلاً فراموش کرده باشید ) در صورت استفاده از توابع یا ماکروهای موجود در فایل سرآیند مورد نیاز ، کامپایلر از شما خطا خواهد گرفت که از دستورات نامفهوم و ناشناس استفاده نموده‌اید

#include

برای ضمیمه کردن فایل سرآیند استاندارد و یا اختصاصی کامپایلر که در کتابخانه آن موجود می باشد ، شما دستور include را باید به همراه یک جفت براکت گوشه ای باز و بسته که مابین آنها نام فایل سرآیند مذکور می آید ، بنویسید

مثال :

#include <stdio.h>
CODE
printf("this is a sentence");

در این مثال فایل سرآیند stdio را که شامل ورودی‌ها و خروجی های استاندارد زبان C می‌شود را ضمیمه نموده‌ایم که این فایل حاوی تابع printf می‌باشد . گرجه نیازی نیست فعلاً آن را بشناسید ، اما این تابع ، متنی را از شما می گیرد و در خروجی خط‌دستوری برنامه شما نمایش می‌دهد ( در اینجا متن this is a sentence به معنی " این یک جمله است " را برای آن در نظر گرفته‌ایم )

دقت کنید که اگر بخواهید فایل سرآیندی را که خودتان آن را نوشته‌اید ، ضمیمه نمائید باید به جای یک جفت براکت گوشه‌ای باز و بسته از دو علامت دابل کوت « " » استفاده نمائید

مثال :

#include "MyHeader.h"

در اینجا فایل MyHeader متعلق به خودمان است و آن را نوشته‌ایم تا به متن برنامه ما ضمیمه شود و از کدهای داخل آن استفاده کنیم ( دقت کنید که نوشتن نام فایل به صورت بالا تنها در صورتی امکان پذیر است که فایل سرآیند ما ( در اینجا MyHeader ) در همان پوشه‌ای ( Folder ) باشد که برنامه ما در حال کامپایل است . اما اگر در همان دایرکتوری در پوشه مجزایی است باید با علامت آدرس دهی سیستم فایل‌بندی سیستم عامل خود ( که عموماً « / » می‌باشد ) آدرس را به کامپایلر بدهیم ؛ مثلاً اگر در پوشه lib است ( که فایل اصلی برنامه ما نیز در آدرسی است که lib در آن قرار دارد ) می‌نویسیم "lib/MyHeader.h" یا اگر به کلی خارج از آدرس و دایرکتوری‌ای است که فایل برنامه در حال کامپایل ما قرار دارد ، آدرس کامل آن را بنویسیم ( استاندارد تعیین کرده که حداکثر هشت بار به صورت تو در تو ، شما می‌توانید در هر قال ضمیمه ، فایل دیگری را ضمیمه کنید . یعنی مثلاً یک فایل را ضمیمه فایل اصلی برنامه می‌کنید با نام hello.c که خود فایل دیگری را ضمیمه کرده با نام myporg.c که خود فایل دیگری را ضمیمه کرده و الی آخر ؛ که می‌تواند تا هشت بار ادامه یابد ؛ اما برخی کامپایلرها از ضمیمه کردن تو در تو تا دفعات بیشتری نیز پشتیبانی می‌کنند )

شما می‌توانید به کمک دستورهای شرطی ، ضمیمه شدن یک یا چند فایل سرآیند را نیز ، شرطی کنید ، مثل :

#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3

#endif

دستور مستقیم بعدی ، پیش پردازنده line می‌باشد که برای تغییر ترتیب خطوط و همچنین نام فایل متن منبع ( source code ) به کار می‌رود . بدین شکل که شما در مقابل دستور line بعد از یک فاصله ، شماره‌ای را می نویسید که این شماره تعیین می کند خط مورد نظر خط چندم فایل می‌باشد . خطوط بر اساس شکسته شدن شمارش می شوند ، اما اگر در خطی از این دستور استفاده نمائید ، آنگاه کامپایلر چینش آن را به نحو دیگری در نظر می گیرد . یعنی مثلاً شما یک متن زبان سی دارید که در خط دوازدهم آن کدهایی را نوشته‌اید و میخواهید کامپایلر آن را به عنوان خط هفتم در نظر بگیرد ، در خط دوازدهم با دستور line عدد هفت را تعیین می‌کنید تا کامپایلر زمانی که از خط ششم عبور کرد ، خط دوازدهم را بخواند و به اجرا بگذارد و زمانی که به خط دوازدهم فایل رسید ، دیگر خط دوازدهمی وجود ندارد و وارد خط سیزدهم می شود . به همین شکل اگر در مقابل دستور line نام فایل متن منبعی را بنویسید ، آنگاه کامپایلر نام فایل شما را با همان نام می شناسد و نه نام فایلی که بر روی حافظه رایانه شما ذخیره گردیده و وجود دارد

مثال :

#include <stdio.h>

int main ()
{

printf("%d", a);
#line 5 int a = 25;

return 0;
}

در این مثال تابع printf می‌خواهد مقدار متغیر a را نمایش دهد ، اما هنوز a مشخص نشده است که در متن ما چیست و اگر یک داده است مقدارش چند است . بنابراین در صورت عدم وجود دستور line کامپایلر از شما خطا خواهد گرفت ، اما با انتقال خط هفتم به خط پنجم تعریف a به خط پنجم انتقال یافت همچنین اگر این متن را داخل یک ویرایشگر متن بنویسیم و آن را با نام Hello.c ذخیره نمائیم و در داخل متن بنویسیم :

#line "World.c"

آنگاه کامپایلر نام فایل را World.c خواهد شناخت و در خروجی برنامه نام World.c را به جای Hello.c در نظر می‌گیرد

دستور دیگری که در استاندارد سال ۹۹ در ادامه ابداعات کمپانی GNU به تصویب رسید ، دستور مستقیم یا همان پیش پردازنده pragma بود . گنیو که همواره ابداعات زیادی در زبان های برنامه‌نویسی ، علی الخصوص زبان سی داشته است ، از این دستور برای توسعه زبان سی در کامپایلر خود استفاده کرد که نظر ISO را به خود جلب کرد . بیشتر به کار گیرنده های زبان C از این پیش پردازنده ، حمایت می کنند و در صورت کسب اطمینان از به رسمیت شناخته شدن آن می‌توانید در متن برنامه خود از این پیش پردازنده ، بهره گیرید

هر کدام از به کارگیرنده های سی به صورت اختصاصی از این پیش پردازنده استفاده می کنند امّا مطابق با استاندارد C ، دستور pragma once به رسمیت شناخته شده است . با این دستور به کامپایلر یا همان به کارگیرنده خود می‌فهمانید که طی کامپایل پروژه ، کامپایلر تنها یک بار حق خواندن و فراخوانی فایل مذکور را دارد . بدین ترتیب شما دیگر مجاز نخواهید بود تا در چند فایل دیگر برنامه ، از قطعه کدهای فایلی که در آن pragma once را نوشته‌اید استفاده کنید

#pragma once
CODE

دستور گرامری آن به همین شکلی می باشد که در بالا نوشته شده است