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 閱讀(622) 評論(0)  編輯  收藏 所屬分類: gcc小試牛力
          主站蜘蛛池模板: 马边| 石狮市| 会理县| 郎溪县| 武安市| 富平县| 赤壁市| 鄂托克前旗| 万源市| 宿松县| 阿合奇县| 龙南县| 柳江县| 团风县| 仙桃市| 吉水县| 驻马店市| 宁津县| 桂平市| 新化县| 巧家县| 平原县| 宁城县| 瑞丽市| 梧州市| 长丰县| 交城县| 陆河县| 张北县| 沂南县| 手游| 定南县| 红河县| 南和县| 武义县| 彭州市| 墨竹工卡县| 吕梁市| 绥棱县| 阜宁县| 郴州市|