第25課 #和##操做符使用分析

·#運算符用於預處理器期將宏參數轉換爲字符串
·#的轉換做用是在預處理器完成的,所以只在宏定義中有效
·編譯器不知道#的轉換做用
·用法:code

define STRING(x) #x

printf("%sn",STRING(HELLO World!)); 字符串

例子25-1:編譯器

include "stdio.h"

define STRING(x) #x

int main()
{io

printf("%s\n",STRING(Hello world!));
printf("%s\n",STRING(100));
printf("%s\n",STRING(While));
printf("%s\n",STRING(return));
return 0;

}
輸出結果:
Hello world!
100
While
return編譯

例子25-2:function

include "stdio.h"

define CALL(f,p) (printf("Call function %sn",#f),f(p))

int square(int n)
{di

return n * n;

}
int func(int x)
{co

return x;

}
int main()
{字符

int result = 0;
result = CALL(square, 4); 
//result = (printf("Call funtion %s\n","square"),square(4));
printf("result = %d\n",result);
result = CALL(square, 10);
printf("result = %d\n",result);

}
輸出結果:
Call function square
result = 16
Call function square
result = 100運算符

運算符

·##運算符用於預處理器粘連兩我的標識符
·##的鏈接做用是在預處理器期完成的,所以只在宏定義中有效
·編譯器不知道##的鏈接做用
·用法

define CONNECT(a,b) a##b

int CONNECT(a,1); //int a1;
a1 = 2;

例子25-3:

include "stdio.h"

define NAME(n) name##n

int main()
{

int NAME(1);
int NAME(2);
 NAME(1) = 1;  //name1 = 1;
 NAME(2) = 2;  //name2 = 2;
 printf("%d\n",NAME(1));
 printf("%d\n",NAME(2));

}
輸出結果:
1
2

例子25-4:

include"stdio.h"

define STRUCT(type) typedef struct _tag_##type type;struct _tag_##type

STRUCT (Student)
{

char *name;
int id;

}
int main()

{

Student s1;
Student s2;
s1.id = 0;
s1.name = "S1";
s2.id = 1;
s2.name = "S2";
printf("s1.name = %s\n",s1.name);
printf("s1.id = %d\n",s1.id);
printf("s1.name = %s\n",s1.name);
printf("s1.id = %d\n",s1.id);
return 0;

}
小結:

運算符用於預處理器將宏參數轉換爲字符串

運算符用於預處理器粘連兩個標識符

編譯器不知道#和##運算符的存在

與##運算符只在紅定義中有效

相關文章
相關標籤/搜索