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 */