我們使用#把巨集引數變為乙個字串,用##把兩個巨集引數貼合在一起.
當巨集引數是另乙個巨集的時候,需要注意的是凡巨集定義裡有用』#』或』##』的地方巨集引數是不會再展開。
下面舉兩個例項:
#define print(f,v)\
printf("the " #v " is :"f ,v) //加上#不會替換引數,只替換其所對應的字元;
int main()
輸出:the name is :lilei
用來取函式名
#define name_str(n) #n
#define strcpy(a,b) strcpy(a##_p,#b) //把第乙個引數後邊加上字元_p,把第二個引數變成字串
void testfun0()
int main()
the fun name:testfun0
// 通過函式名呼叫函式
#include "stdafx.h"
#include #include using namespace std;
#define print(f,v)\
printf("the " #v " is :"f ,v) //加上#不會替換引數,只替換其所對應的字元;
bool testfun0(string name, int mode)
bool testfun1(string name, int mode)
bool testfun2(string name, int mode)
using testfunc = bool(*)(string name, int mode);
using testpair = std::pair;
#define name_str(n) #n
#define test_func(x) testpair( name_str(x), x)
// 將函式儲存,方便通過 key 方式呼叫函式
mapallfunc = ;
int main()
return 0;
}
#include "stdafx.h"
#include #include using namespace std;
#define cat(str1, str2) str1##str2
#define string(x) #x
#define strcpy(a,b) strcpy(a##_p,#b) //把第乙個引數後邊加上字元_p,把第二個引數變成字串
int main()
輸出:
aaa234
var2
var1
乙個比較實際的應用:
#define struct(type) typedef struct _tag_##type type;\
struct _tag_##type
struct(student);
int main()
//上述 struct(student)根據巨集展開即:
struct _tag_student
typedef struct _tag_student student;
//也等於
typedef struct _tag_student
student;
其實就是正常定義了乙個結構體型別;這麼寫是以前的寫法,寫的比較精練;
C語言中的「 」和「
先說左移,左移就是把乙個數的所有位都向左移動若干位,在c中用 運算子.例如 int i 1 i i 2 把i裡的值左移2位 也就是說,1的2進製是000.0001 這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0 左移2位之後變成 000.0100,也就是10進製的4,所以說左移...
C語言中a和 a
一.a 這裡我們先看看陣列名代表的是什麼,這個概念可能大家有所誤解,認為陣列名代表的就是陣列的位址,當然,陣列名代表的是乙個位址,但是關鍵是,通過這個位址,我們關注的是它能取得多大空間的資料的值。例如對於乙個char 型別的位址,我們能夠取得乙個位元組的值,對於乙個int型的位址,我們能夠取得4個位...
C語言中的 和 符號
之前對 和 符號一直理解的比較淺顯。只知道 p好像表示的是乙個指標 p表示的是乙個位址。然而這次當遇到了下面這個情況的時候 int a 10 int b a printf d n a printf d n a printf d n b printf d n b 結果 10 6487620 64876...