اطلاعیه

Collapse
No announcement yet.

سوالاتی درباره قواعد زبان C

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    سوالاتی درباره قواعد زبان C

    سلام. چند تا سوال در مورد بعضی دستورات و قواعد زبان C (کامپایلرهای میکروها) دارم.
    اولا اینکه در فایلهای سرآیند (*.h) یا همون کتابخانه های زبان C که اکثرا توسط افراد ساخته می شوند در ابتدای آنها متن زیر آورده شده:
    #ifndef اسم کتابخانه با حروف بزرگ
    #define اسم کتابخانه با حروف بزرگ
    مثلا کتابخانه ای هست برای WINAVR که با آن می توان LCD های کاراکتری را هر جوری که می خواهیم پیکره بندی کنیم و اسمش lcd_lib.h است. در ابتدای این کتابخانه و قبل از include کردن فایلهای سرایند این دو خط نوشته شده است:

    #ifndef LCD_LIB
    #define LCD_LIB

    منظور از این کار چیه؟ اگه ممکنه توضیح بدید. ضمنا ایا حتما باید نام کتابخانه عینا نوشته شود؟(بدون پسوند .h) و حتما باید با حروف بزرگ باشد؟
    چند سوال دیگه دارم که بعدا می پرسم.
    خیلی ممنونم.

    #2
    پاسخ : سوالاتی درباره قواعد زبان C

    درود

    ( چقدر جالب ، چند شب پیش درباره همین قضیه توی کانال IRC با دوستان صحبت میکردیم )

    اینکارو برای این انجام میدن که اگر یه فایل سرآیند ( هیدر ) در بیشتر از یک جا include بشه ( ناخواسته ) ، فقط یکبار توسط کامپایلر دیده بشه
    که اصطلاحا به اینکار میگن Guard گزاشتن

    فایل سرآیند ، اگر یکبار از یه جا include بشه ، یه اسمی define میشه ( هر اسمی میتونه باشه ، ولی رسم هست که اسم همون فایل هیدر رو انتخاب میکنن )
    و اگر برای بار دوم هم include شد ، چون اون اسم قبلا define شده ، دیگه کامپایلر به محتویات بین ifndef تا endif نگاه نمیکنه ( بخاطر شرط ifndef xx_x# )

    مثلا یکی از علتهای این کار ، وارد نشدن کامپایلر به حلقه بی نهایت هست
    چگونه هوشمندانه بپرسیم

    دیدگاه


      #3
      پاسخ : سوالاتی درباره قواعد زبان C

      سلام. از توضیحات کاملتون خیلی ممنونم.
      اگه فقط برای این منظور که از دوباره #include کردن جلوگیری بشه تعریف می شوند پس چرا اگر این قسمت را پاک کنیم کامپایلر کلی error می گیره؟
      ضمنا بفرمایید منظورتون از دوباره تعریف کردن چیه؟ یعنی منظورتون دوباره تعریف کردن در یک فایل مثل main.c است یا تمام فایلهایی که مربوط به یک پروژه می شوند؟ (مثل بقیه فایلهای سرایند)

      دیدگاه


        #4
        پاسخ : سوالاتی درباره قواعد زبان C

        نوشته اصلی توسط regiona
        اگه فقط برای این منظور که از دوباره #include کردن جلوگیری بشه تعریف می شوند پس چرا اگر این قسمت را پاک کنیم کامپایلر کلی error می گیره؟
        همین دیگه
        مثلا اگه دو تا ( یا بیشتر ) تابع یا متغیر هم نام تعریف بشه ( توسط چند با include شدن یک فایل header ) باید هم کامپایلر error بگیره
        ( من گفته بودم [glow=red,2,300]یکی[/glow] از دلایلش وارد نشدن کامپایلر به حلقه هست )

        نوشته اصلی توسط regiona
        ضمنا بفرمایید منظورتون از دوباره [glow=red,2,300]تعریف کردن[/glow] چیه؟ یعنی منظورتون دوباره تعریف کردن در یک فایل مثل main.c است یا تمام فایلهایی که مربوط به یک پروژه می شوند؟ (مثل بقیه فایلهای سرایند)
        دوباره الحاق ( include ) کردن رو میفرمایید ؟
        اتفاقه دیگه ، ممکنه چند تا فایل سورس ( مثل main.c ) به یه فایل هیدر نیاز داشته باشن
        دیگه اون فایلهای سورس که نباید حواسشون به این باشه که اگر اون فایل هیدر include شده بود ، دیگه اونرو include نکن !
        اینکار به عهده خود اون فایل سرآیند گزاشته میشه ( guard کردن )
        چگونه هوشمندانه بپرسیم

        دیدگاه


          #5
          پاسخ : سوالاتی درباره قواعد زبان C

          سلام. اقا خیلی ممنونم.کاملا متوجه شدم.
          سوال دیگم اینه که اگه ممکنه در مورد پیش پردازنده #pragma توضیح کاملی بدهید.
          ضرورت وجود این دستور و استفاده از آن چیست؟

          دیدگاه


            #6
            پاسخ : سوالاتی درباره قواعد زبان C

            راستشو بخواین pragma# دقیقا نمیدونم واسه چیه :redface:
            اینو دیگه دوستان باید کمک کنن
            چگونه هوشمندانه بپرسیم

            دیدگاه


              #7
              پاسخ : سوالاتی درباره قواعد زبان C

              سلام.
              هر کامپایلری چند نوع #pragma مخصوص خودش را دارد.
              دستور #pragma برای این است که بتوان سورس نوشته شده در یک کامپایلر میکرو را به راحتی و با کمترین تغییرات در یک کامپایلر C استاندارد دیگر اجرا کرد.
              برای مثال برای نوشتن تابع وقفه دریافت از پورت سریال در کامپایلر IAR بدین صورت عمل می کنیم:

              #pragma vector=0x16
              __interrupt void serial(void)
              {
              }

              خب حالا اگر این کد را در یک کامپایلر استاندارد دیگر اجرا کنیم از دستور #pragma ارور نمی گیرد و فقط هشدار می دهد که این نوع #pragma را نمی شناسد. دقت کنید کامپایلر C ANCI . نه کدویژن
              البته مطمئنا از تابع وقفه ایراد می گیرد. زیرا در هر کامپایلری شکل تابع وقفه فرق می کند.
              برای دیدن دستورات #pragma در یک کامپایلر به help آن مراجعه کنید.
              امیدوارم درست گفته باشم. اگه مشکلی داشت دوستان اصلاح کنن یا کامل ترش کنند تا منم بیشتر یاد بگیرم.
              موفق باشید.

              دیدگاه

              لطفا صبر کنید...
              X