6、宏組合 #和##
先上一段代碼:
#include "stdafx.h"
#include<iostream>
using namespace std;
#define s5(a) Connect_##a
#define s(p) #p
void Connect_Test(const char* p)
{
cout << "this is Connect Test:" << endl;
cout << p << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
s5(Test)("hello owrld");
cout << "******************************************************" << endl;
cout << s(p)<< endl;
return 0;
}
上述代碼的輸出結果如下:
由 圖中可以看出#的作用是將其後邊的宏參數進行轉化爲字符串,即爲其後的參數加上雙引號。而##則是連接符號,用來連接兩個宏。
需要注意的是,當宏參數中有#或者##的地方,宏參數是不會被展開的。例如下邊的代碼:
#include "stdafx.h"
#include<iostream>
using namespace std;
#define A (2)
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
int _tmain(int argc, _TCHAR* argv[])
{
cout << "........................................................" << endl;
cout << "int max: " << endl;
cout << STR(INT_MAX) << endl; // INT_MAX
cout << "--------------------------------------------------------" << endl;
cout << STR(CON(a, b)) << endl;
return 0;
}
這段代碼的輸出爲:
由上述結果可以看出:當宏參數中有#或者##的地方,宏參數是不會被展開的。
二、C#中宏功能的代替
對於使用宏定義常量,在C#中可以使用const 來定義常量,正如前邊所說的,這必然會帶來類型安全檢查,以及分配內存,但沒辦法,C#中不支持宏操作。目前我所知道的就這個了,歡迎指出。
至於條件編譯,在C#中可以使用#if DEBUG ...#else...#endif來進行條件編譯,在VS中,右鍵單機項目->屬性->生成 ,在條件編譯符號下,勾選定義DEBUG常量,即可實現條件編譯。如下圖:
至於宏 其他功能在C#中的實現,暫時就不太清楚了,待更新...