#和##运算符
文章目錄
- 1 #運(yùn)算符:字符串化
- 1.1 #運(yùn)算符的基本概念
- 1.2 #運(yùn)算符的妙用
- 2 ##運(yùn)算符:預(yù)處理器粘合劑
- 2.1 ##運(yùn)算符的基本概念
- 2.2 ##運(yùn)算符的工程應(yīng)用
- 3 宏不展開的特殊情況
1 #運(yùn)算符:字符串化
1.1 #運(yùn)算符的基本概念
#運(yùn)算符的基本概念:
- #運(yùn)算符用于在預(yù)處理期將宏參數(shù)轉(zhuǎn)換為字符串。
- #的轉(zhuǎn)換作用是在預(yù)處理期完成的的,因此只在宏定義中有效。
- 編譯器不知道#的轉(zhuǎn)換作用。
用法:
預(yù)處理后的結(jié)果:
int main(void) {"hello""nihao";"Aha";return 0; }1.2 #運(yùn)算符的妙用
#include <stdio.h>#define CALL(f, p) (printf("Call function %s\n", #f), f(p))int square(int n) {return n * n; }int func(int x) {return x; }int main() {int result = 0;result = CALL(square, 4);printf("result = %d\n", result);result = CALL(func, 10);printf("result = %d\n", result);return 0; }2 ##運(yùn)算符:預(yù)處理器粘合劑
2.1 ##運(yùn)算符的基本概念
##運(yùn)算符的基本概念:
- ##運(yùn)算符用于在預(yù)處理期粘連兩個標(biāo)識符。
- ##的連接作用是在預(yù)處理期完成的,因此只在宏定義中有效。
- 編譯器不知道##的連接作用。
用法:
2.2 ##運(yùn)算符的工程應(yīng)用
#include <stdio.h>#define STRUCT(type) typedef struct _tag_##type type;\struct _tag_##typeSTRUCT(Student) {char* name;int id; };int main() {Student s1;Student s2;s1.name = "s1";s1.id = 0;s2.name = "s2";s2.id = 1;printf("s1.name = %s\n", s1.name);printf("s1.id = %d\n", s1.id);printf("s2.name = %s\n", s2.name);printf("s2.id = %d\n", s2.id);return 0; }3 宏不展開的特殊情況
當(dāng)參數(shù)的前面有#或者##運(yùn)算符時,參數(shù)不展開。
#define R B #define A hello #define B(x) x#define C(x) #x #define D(x, y) x##yint main(void) {B(A);C(A);D(A, B);B(R); // 宏只會替換一次,并不會進(jìn)行遞歸替換return 0; }預(yù)處理后的結(jié)果:
int main(void) {hello;"A";AB;B;return 0; }總結(jié)
- 上一篇: 洛阳车内顶棚布脱落怎么办?
- 下一篇: 预处理指令的开始和结束