C語言中一些不常見的預先處理命令

來源:互聯網
上載者:User

       最近在研究德州儀器(TI)的達芬奇(DaVinci)技術,於是乎又開始讀代碼的工作了。這是一項浩大的工程,成百上千,或許更多的結構體定義,滿篇的預先處理與宏定義,眼花繚亂啊,不得不佩服大公司的開發人員,能夠搞出幾百兆的開發套件(DVSDK),這都是文字檔累積出來的呀。

      步入正題,因為該開發套件是針對各種平台的,所以裡面的標頭檔裡使用了大量的像 #ifndef、#ifdef、#elif、#else、#endif 這樣的預先處理命令。並且也有其它一些不常見的,呵呵,有些童鞋可能遇到比較多,我是很少接觸到這樣的命令 ^_^  。既然出現了,也不能放著不管,索性去查了一下,順便把其它一些不常見的預先處理命令也一併瞭解了,馬上就要找工作了,就當作是複習吧,呵呵。

      1、#error

      #error指令將使編譯器顯示一條錯誤資訊,然後停止編譯。

      文法格式:

      #error message: 編譯器遇到此命令是停止編譯,並將參數 message 輸出。該命令常用於程式調試。下面舉個例子:

            #ifndef XXXX
            #error XXXX has not been defined
            #endif

      當程式比較大時,有些宏定義往往是在外部指定的(如makefile),或是在系統標頭檔中指定的,當你不太確定當前是否定義了 XXXX 時,就可以像上面那樣進行編譯。這樣,如果編譯時間出現錯誤 fatal error C1189: #error :  XXXX has not been defined(我這是在VC++6.0中做的實驗),表明宏XXXX還沒有被定義。

      2、#line

      #line指令可以改變編譯器用來指出警告和錯誤資訊的檔案號和行號,該命令常用於程式調試。這個可能不好理解,下面舉個例子一下就明白了。

      建立一個 main.c 的源檔案:

      1     #include <stdio.h>
      2
      3     main()
      4      {
      5          int result = add(5, 4);
      6          printf("result = %d", result);
      7      }

      因為add這個函數沒有定義,所以編譯肯定是會報錯的,下面是編譯錯誤資訊:

      --------------------Configuration: pretest - Win32 Debug--------------------
      Compiling...
      main.c
      D:\Program Files\Microsoft Visual Studio\MyProjects\pretest\main.c(5) : warning C4013: 'add' undefined; assuming extern returning int

      注意:上面紅色背景的5代表出現錯誤的是第5行。

      下面,我們修改一下原始碼:

      1     #include <stdio.h>                            1
      2     #line 10                                               2
      3     main()                                                10
      4      {                                                          11
      5          int result = add(5, 4);                  12
      6          printf("result = %d", result);       13
      7      }                                                          14

      #line 10 表示從它的下一行開始,行號變為10,後面的行號依次累加,如綠色背景所示。

      再次編譯,顯示的錯誤行號就變為12了。

      --------------------Configuration: pretest - Win32 Debug--------------------
      Compiling...
      main.c
      D:\Program Files\Microsoft Visual Studio\MyProjects\pretest\main.c(12) : warning C4013: 'add' undefined; assuming extern returning int

      3、#

      出現在宏定義中的 # 運算子把跟在其後的參數轉換成一個字串,例如:  

            #include <stdio.h>

            #define STR(n) "abc"#n

            main()
            {
                 printf("%s\n", STR(DEF));
            }

      程式執行輸出:abcDEF

      4、##

      ##運算子用於把參數串連到一起。預先處理程式把出現在 ## 兩側的參數合并為一個符號(注意,不一定是字串,也可能是其它資料類型),看下面的例子:

            #include <stdio.h>

            #define NUM(a, b, c) a##b##c
            #define STR(a, b, c) a##b##c

            main()
            {
                 printf("%d\n", NUM(1, 2, 3));
                 printf("%s\n", STR("ab", "cd", "ef"));
            }

      程式執行輸出:

            123
            abcdef

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.