1 /**
2 * 文 件:Definesing.cpp
3 * 功 能:宏定义的实例集合!
4 * 作 者:rainy_blue_sky
5 * 主 页:http://hi.baidu.com/rainy_blue_sky
6 * 说 明:请尊重知识产权,转载请勿删掉该注释!
7 */
8 #include <iostream>
9 #include <fstream>
10 #include <iomanip>
11 using namespace std;
12
13
14 int main()
15 {
16 //ofstream cout("1.txt");
17
18 cout << "******特殊的define用法******\n";
19 #define A1(a) T_##a //A1(1) --> T_1
20 #define A2(a) @a //A2(1) --> '1'
21 #define A3(a) #a //A3(1) --> "1"
22 #define T_1 10
23 cout << A1(1) << endl;
24 // cout << A2(1) << endl; //无法编译通过
25 cout << A3(1) << endl;
26
27 cout << "\n******define的多行定义******\n";
28 #define MACRO(arg1, arg2) do{\
29 /*declarations*/\
30 int a;\
31 int b;\
32 a = arg1;\
33 b = arg2;\
34 cout << a << "\t" << b << endl;\
35 /*other statement*/\
36 }while(0)
37 MACRO(10, 20);
38
39 cout << "\n******如何定义宏、取消宏******\n";
40 #define PI (3.1415926)
41 #undef PI
42 cout << "#define [MacroName] [MacroValue]\n"
43 << "#unde [MacroName]\n";
44
45 cout << "\n******条件编译******\n";
46 #ifdef SJ
47 cout << "SJ is Define" << endl;
48 #else
49 cout << "SJ is not Define" << endl;
50 #endif // SJ
51
52 cout << "\n******重新定义类型******\n";
53 typedef unsigned char boolean;
54 typedef unsigned long int uint32;
55 typedef unsigned short uint16;
56 typedef unsigned char uint8;
57 typedef signed long int int32;
58 typedef signed short int16;
59 typedef signed char int8;
60 cout << "typedef unsigned char boolean;\n"
61 << "typedef unsigned long int uint32;\n"
62 << "typedef unsigned short uint16;\n"
63 << "typedef unsigned char uint8;\n"
64 << "typedef signed long int int32;\n"
65 << "typedef signed short int16;\n"
66 << "typedef signed char int8;\n";
67 unsigned char a;
68 a = 'c';
69
70 cout << "\n******得到指定地址上的一个字节或者字******\n";
71 typedef unsigned char byte;
72 typedef unsigned short word;
73 #define GET_BYTE(x) (*((byte*)(x)))
74 #define GET_WORD(x) (*((word*)(x)))
75 int address = 0;
76 setiosflags(ios::uppercase);
77 cout << GET_BYTE(&a) << endl
78 << GET_WORD(&a) << endl;
79
80 cout << "\n******得到一个field在结构体(struct)中的偏移量******\n";
81 #define FPOS(type, field) ((int)&(((type*)0)->field))
82 struct SizeOfStruct
83 {
84 unsigned int s1;
85 char s2;
86 unsigned int s3;
87 unsigned int s4;
88 };
89 cout << "SizeOfStruct: " << sizeof(SizeOfStruct) << endl;
90 cout << "s1: " << FPOS(SizeOfStruct, s1) << endl;
91 cout << "s2: " << FPOS(SizeOfStruct, s2) << endl;
92 cout << "s3: " << FPOS(SizeOfStruct, s3) << endl;
93 cout << "s4: " << FPOS(SizeOfStruct, s4) << endl;
94
95 cout << "\n******得到一个field在结构体(struct)中的所占的偏移量******\n";
96 #define FSIZE(type, field) sizeof(((type*)0)->field)
97 cout << "SizeOfStruct: " << sizeof(SizeOfStruct) << endl;
98 cout << "s1: " << FSIZE(SizeOfStruct, s1) << endl;
99 cout << "s2: " << FSIZE(SizeOfStruct, s2) << endl;
100 cout << "s3: " << FSIZE(SizeOfStruct, s3) << endl;
101 cout << "s4: " << FSIZE(SizeOfStruct, s4) << endl;
102
103 cout << "\n******按照LSB格式把两个直接转化为一个Word******\n";
104 #define MERGE_BYTE(byte1, byte2) (((word)((byte1)*256))+ (byte2))
105 byte mergeA = 0x10;
106 byte mergeB = 0x20;
107 cout << hex <<MERGE_BYTE(mergeA, mergeB) << endl;
108
109
110 cout << "\n******按照LSB格式把WORD拆分为byte******\n";
111 #define SEGMENTATION(com, byte1, byte2) {\
112 byte1 = ((com)/256);\
113 byte2 = ((com)&0xFF);\
114 }
115 word com = 0x1020;
116 byte byte1, byte2;
117 SEGMENTATION(com, byte1, byte2);
118 cout << hex << (int)byte1 << "\t" << (int)byte2 << endl;
119
120 cout << "\n******得到一个字的高位和低位字节******\n";
121 #define WORD_LO(value) ((byte)((value)&0xFF))
122 #define WORD_HI(value) ((byte)((value)>>8))
123 word value = 0x1020;
124 byte low, high;
125 cout << hex << "value: " << value << endl
126 << "low: " << (int)WORD_LO(value) << endl
127 << "high: " << (int)WORD_HI(value) << endl;
128
129 cout << "\n******返回一个比x大的8的倍数******\n";
130 #define SEED8(x) ( ((x)+7)/8*8 )
131 int seed1 = 11;
132 cout << "x = 10: " << SEED8(seed1) << endl;
133
134 cout << "\n******将字母转换为大写******\n";
135 #define UPCASE(c) (((c) >= 0x61 && (c) <= 0x7A) ? ((c) - 0x20) : (c))
136 cout << "a: " << (char)UPCASE('a') << endl;
137
138 cout << "\n******变量自增防止溢出******\n";
139 #define INC_VAL(val) ((val) = (((val)+1) > (val)) ? (val)+1 : (val))
140 unsigned int valueInc = 0xFFFFFFFF;
141 cout << "valueInc: " << valueInc << endl;
142 cout << "INC_VAL(valueInc): " << INC_VAL(valueInc) << endl;
143
144 cout << "\n******返回数组元素的个数******\n";
145 #define ARR_SIZE(a) (sizeof((a))/sizeof((a)[0]))
146 int ARR[20] = {0};
147 cout << sizeof(ARR) << "\t" << sizeof(ARR[0]) << endl;
148 cout << "ARR[20]: " << ARR_SIZE(ARR) << endl;
149
150 cout << "\n******调试跟踪宏******\n";
151 cout << "__LINE__: " << __LINE__ << endl
152 << "__FILE__: " << __FILE__ << endl
153 << "__DATE__: " << __DATE__ << endl
154 << "__TIME__: " << __TIME__ << endl
155 << "__STDC__: " << __STDC__ << endl;
156 #ifdef _DEBUG
157 cout << "hello: " << endl;
158 #endif // __DEBUG
159 int a12 = 10;
160 a12 ++;
161
162 cout << "\n******宏定义防止错误使用大括号包含******\n";
163 #define BRACES_ERROR {cout << "BRACES ERROR!\n";}
164 #define DOWHILE_RIGHT do{\
165 cout << "DOWHILE RIGHT!\n";\
166 }while(0)
167 /* if(1) //去掉注释会出现错误
168 BRACES_ERROR;
169 else
170 {
171 }
172 */
173 if(1)
174 DOWHILE_RIGHT;
175 else
176 {
177 }
178
179 return 0;
180 }
181
182 /**
183 * 实例总结:
184 * 特殊的define用法:
185 * 通过使用其特殊的用法,可以控制代码,这是非常有用的,
186 * 需要有一个意识,代码控制的是逻辑,所以宏定义是对代码进行的编程。
187 * define的多行定义:
188 * 通过这种形式可以实现复杂的函数,不过宏定义的函数也有自己的弊端,在此从略。
189 * 条件编译:
190 * 条件编译的用处很多!其实,我们现在应该是更进一步的体会条件编译,
191 * 编译器的控制。
192 * 得到指定地址上的一个字节或者字:
193 * 这是一种很简单的用法,就是将地址转换为指定的格式(这里可以理解格式的本质)
194 * 之后,在对其进行取值!
195 * 调试跟踪宏:
196 * __STDC__ 宏指令的意义是编译时定义的。一般来讲,如果__STDC__已经定义,
197 * 编译器将仅接受不包含任何非标准扩展的标准C/C++代码。如果实现是标准的,
198 * 则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。
199 * 宏定义防止错误使用大括号包含:
200 * 这是由于if语句固有的特性决定的if{};那么if语句结束,如果后面有else,也不会匹配!
201 *
202 */