ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          1.關于可移植性
          #ifdef __STRICT_ANSI__
          /* use ANSI/ISO C only here */
          #else
          /* use GNU extensions here */
          #endif
          如果用戶或是ANSI兼容的編譯器定義了__STRICT_ANSI__宏,則表明需施加ANSI兼容的環境,并編譯#ifdef語句塊的第一部分代碼.否則,編譯#else后面的代碼.
          2.GNU擴展
            gcc使用long long 類型來提供64位儲存單元:
            long long long_int_var;
          內聯函數
            要使用內聯函數,需在函數的返回類型前面插入關鍵字inline,如下面的代碼片段所示,還要在編譯時使用-O優化選項.
            inline void swap(int *a, int *b)
            {
              int tmp = *a;
              *a = *b;
              *b = tmp;
            }
          函數和變量屬性
            關鍵字attribute通過向gcc指明有關代碼的更多信息來幫助代碼優化工作進行得更好.例如,標準庫函數exit和 abort都不返回調用它們的函數.編譯器如果知道它們不返回就能生成效率稍高的代碼.當然用戶程序也能定義不返回的函數.gcc允許為這些函數指定 noreturn屬性,作為編譯器在優化該函數時的提示.
            
          例如,假設有個沒有返回的函數die_on_error.為了使用函數屬性,可以在函數聲明后面加上__attribute__((attribute_name)).于是函數die_on_error的聲明如下:
            void die_on_error(void) __attribute__ ((noreturn));
          函數還和平常一樣來定義:
            #include <stdlib.h>
            void die_on_error(void)
            {
              /* your code here */
              exit(EXIT_FAILURE);
            }

          也可以對變量指定屬性.例如,aligned屬性指示編譯器在為變量分配內存空間時按指定字節數對齊邊界.下列語句:
            int int_var __attribute__ ((aligned 16)) = 0;
          使gcc讓變量int_var的邊界按16字節對齊.packed屬性告訴gcc為變量或結構分配最小的內存空間.

          如果想要關閉對未用變量發出的所有警告,那么可以對變量使用unused屬性,它告訴編譯器該變量不準備使用.下面的變量聲明會消除警告:
            float big_salary __attribute__ ((unused));

          使用case區間
          case區間是一個非常有用的擴展.其語法如下:
            case LOWVAL ... LOWVAL:
          注意,在省略號前后必須有空格.在switch語句中,case區間指定了落在LOWVAL和HIVAL區間內的那些整數值.例如:
            switch(int_var) {
            case 0 ... 2:
              /* your code here */
              break;
            case 3 ... 5:
              /* more code here */
              break;
            default:
              /* default code here */
            }

          構造函數名稱
            把函數名用作字符串是GNU的擴展,它能極大地簡化調試工作.gcc預先定義了變量__FUNCTION__為當前函數(控制流程當前所在的位置)的名字,就好像它被寫在源代碼里去了一樣.

          使用__FUNCTION__變量
          /*
          *  showit.c - Illustrate using the __FUNCTION__ variable
          */
          #include <stdio.h>

          void foo(void);

          int main(void)
          {
            printf("The current function is %s\n", __FUNCTION__);
            foo();
            return 0;
          }

          void foo(void)
          {
            printf("The current function is %s\n", __FUNCTION__);
          }
          posted on 2005-08-04 21:55 ivaneeo 閱讀(624) 評論(0)  編輯  收藏 所屬分類: gcc小試牛力
          主站蜘蛛池模板: 吴堡县| 鄂尔多斯市| 广河县| 本溪市| 晋江市| 砚山县| 涞源县| 襄汾县| 田东县| 嘉义市| 潜山县| 大方县| 南郑县| 通海县| 拜城县| 庄浪县| 民和| 务川| 黄平县| 普宁市| 宁陵县| 蛟河市| 马关县| 阜阳市| 佛学| 商水县| 历史| 弋阳县| 新乐市| 铅山县| 礼泉县| 报价| 通许县| 旬阳县| 准格尔旗| 桂平市| 米脂县| 宁陕县| 八宿县| 丹凤县| 锦屏县|