最近在研究德州儀器(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