主题三 编译过程介绍----20.#和##运算符的使用分析

来源:互联网 发布:anywhere软件源 编辑:程序博客网 时间:2024/06/05 19:45

#运算符用于在预编译期将宏参数转换为字符串


#include<stdio.h>#define  CONVERS(x)  #xint main(){    printf(“%s\n”,CONVERS(Hello Word!));  printf(“%s\n”,CONVERS(while));  printf(“%s\n”,CONVERS(return));  retrun 0;}//输出:while,return//通过中间文件,发现预编译后,printf函数中被替换成字符串了。


//#运算符的妙用#include <stdio.h>#define CALL(f, p) (printf("Call function %s\n", #f), f(p))   int square(int n){    return n * n;}int f(int x){    return x;}int main(){        printf("1. %d\n", CALL(square, 4));    printf("2. %d\n", CALL(f, 10));    return 0;}//Output://        Call  function aquare
//        1.   16//        Call  funtion f//        2.   10

##运算符用于在预编译期粘连两个符号

#include <stdio.h>#define NAME(n) name##nint main(){        int NAME(1);    int NAME(2);        NAME(1) = 1;    NAME(2) = 2;        printf("%d\n", NAME(1));    printf("%d\n", NAME(2));    return 0;}


//##运算符在定义结构体的妙用#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("%s\n", s1.name);    printf("%d\n", s1.id);    printf("%s\n", s2.name);    printf("%d\n", s2.id);    return 0;}



原创粉丝点击