宏定義#define的使用

在代碼中使用宏定義比較方便,提高程序的運行效率,增加健壯性和方便性。
編譯器會在預編譯的時候進行簡單的宏替換。
1、利用define來定義數值宏常量
利用define來定義數值類型的數據,一般只是用來定義  常量 ,如果 要定義一些變量,則可以使用c語言中const這個關鍵字。
const 修飾的數據是有類型的,而define 宏定義的數據沒有類型。爲了安全,我建議你以後在定義一些宏常數的時候用const代替,編譯器會給const 修飾的只讀變量做類型校驗,減少錯誤的可能。
const修飾的不是常量而是readonly 的變量,const 修飾的只讀變量不能用來作爲定義數組的維數,也不能放在case 關鍵字後面。
2、利用define來定義字符串宏常量
經常利用define來定義路徑,路徑太長的話,可以使用反斜槓接續符,反斜槓作爲接續符時,在本行其後面不能再有任何字符,空格都不行。所以,只有最後一個反斜槓纔是接續符。
#define TEST_STRING "sfdfsfsfsf\
gdsdfsf"

3、利用define來定義註釋符號
#define BSC //
#define BMC /*
#define EMC */

BSC Test line
BMC Another test line EMC

註釋先於預處理指令被處理,當這三個宏定義被替換的時候,註釋已經處理完畢。

4、利用define來定義表達式
#define SQR(x) x*x
假設x的值是表達式3+1,SQR(x)會被替換爲3+1*3+1。出現錯誤。
因此定義表達式的時候,最好不要省略最外層括號。
正確定義:
#define SQR(x) ((x)*(x))
宏函數被調用時以實參替換形參,而不是“值傳遞”。

5、宏定義中的空格
#define ADD (x) ((x) + (x))
由於ADD和(x)之間有空格,宏定義不是我們想要的結果,表示定義了一個ADD,其代表的是(x) ((x) + (x))。
在定義宏函數的時候,注意空格的位置,而在使用宏函數的時候,空格會被編譯器忽略。

6、#undef的使用
#undef是用來撤銷宏定義的。
#define ADD(x) ((x) + (x))
//code
#undef ADD
//宏定義ADD被撤銷,下面的代碼不能用ADD了。

7、特殊字符串的使用
##表示連接。
#@表示轉化爲字符,加單引號。
#表示轉化爲字符串,加雙引號。

代碼如下:
#include <iostream>
using namespace std;

#define Connect(x,y) x##y
#define ConvertToChar(x) #@x
#define ConvertToString(x) #x

void main()
{
char* pTest1 = Connect("abcd", "efg"); // 結果是pTest1 = "abcdefg"
char test = ConvertToChar(1); // 結果是test = '1';
char* pTest2 = ConvertToString(123456); // 結果是pTest2 = "123456";

cout << pTest1 << endl;
cout << pTest2 << endl;
cout << test << endl;

system("pause");
}
執行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章