C++宏的作用與C#裏宏的代替(三)

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#中的實現,暫時就不太清楚了,待更新...




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