1. #运算符

(1)#运算符用于在预处理期将宏的参数转换为字符串

(2)#的转换作用是在预处理期完成的,因此只在宏定义中有效,即其他地方不能用#运算符

(3)用法:#define STRING(x) #x

printf("%s\n",STRING(Hello World!));//注意,Hello World!不加引号!

#include <stdio.h>
#define STRING(x) #x
int main()
{
//注意宏参数不用加引号,#运算符在宏替换时会自动加上去
printf("%s\n",STRING(Hello World!)); //"Hello World!"
printf("%s\n",STRING()); //"100"
printf("%s\n",STRING(while)); //"while"
printf("%s\n",STRING(return)); //"return"
return ;
}

#运算符的妙用

#include <stdio.h>
//注意宏后面的为逗号表达式,返回的是第 1 个表达式的值
//该宏最大的用处在于,可以输出被调用的函数的名称
#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 iRet = ;
//将函数名称作用宏参数,利用#运算符将这个名称转为字符串输出
//同时,逗号表达式最后一个式子调用相应的函数
iRet = CALL(square,);
printf("result = %d\n",iRet);//输出函数名,并调用函数
iRet = CALL(func,);
printf("result = %d\n",iRet);//输出函数名,并调用函数
return ;
}

2. ##运算符

(1)##运算符用于在预处理期粘连两个标识符

(2)##的连接作用是在预处理期完成的,因此只在宏定义中有效。

(3)编译器不知道##的连接作用

(4)用法:

#define CONNECT(a,b) a##b

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

a1 = 2;

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

##运算符的工程应用

#include <stdio.h>
//该宏可以方便定义结构体,并给结构体命名。
//省去每次在定义结构体时,都要重复地写上
//typedef struct ....之类的相同代码
#define STRUCT(type) \
typedef struct _tag_##type type;\
struct _tag_##type
//定义结构体,并命名为 Student
STRUCT(Student)
{
char* name;int id;
}; int main()
{
Student s1;
Student s2;
s1.name = "s1";
s1.id = ;
s2.name = "s2";
s2.id = ;
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 ;
}

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

C语言学习笔记--#和##操作符的更多相关文章

  1. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  2. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  3. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  4. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  5. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  6. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  7. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  8. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  9. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

随机推荐

  1. Centos 查看版本

    # cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)

  2. javascript给输入框赋值的一个误区

    一. 错误的示范 如下代码所示,如果需要用javascript获取id为username1, password1的输入框的值,将其写入id为username2, password2的输入框,那么红线区 ...

  3. mybatis中&gt;=和&lt;=的实现方式

    原因 mybatis使用的是xml格式的文件.使用>和<号的时候,会存在与xml的标签的规范冲突. 解决方案 >=使用 <![CDATA[>=]]> >< ...

  4. ROC曲线是通过样本点分类概率画出的 例如某一个sample预测为1概率为0.6 预测为0概率0.4这样画出来,此外如果曲线不是特别平滑的话,那么很可能存在过拟合的情况

    ROC和AUC介绍以及如何计算AUC from:http://alexkong.net/2013/06/introduction-to-auc-and-roc/ ROC(Receiver Operat ...

  5. CentOS 6.8安装Docker V1.0

    rpm -Uvh http://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum -y install do ...

  6. New Concept English three (47)

    Pollution is the price we pay for an overpopulated, over industrialized planet. When you come to thi ...

  7. Leetcode 969. Pancake Sorting

    每次找到当前最大数,转两下把最大数转到最右边.重复这个操作,直到都转完. 时间复杂度O(n**2) class Solution(object): def pancakeSort(self, A): ...

  8. Java进阶知识点2:看不懂的代码 - 协变与逆变

    一.背景 要搞懂Java中的协办与逆变,不得不从继承说起,如果没有继承,协变与逆变也天然不存在了. 我们知道,在Java的世界中,存在继承机制.比如MochaCoffee类是Coffee类的派生类,那 ...

  9. LeetCode Sum of Square Numbers

    原题链接在这里:https://leetcode.com/problems/sum-of-square-numbers/description/ 题目: Given a non-negative in ...

  10. 2017.10.3北京清北综合强化班DAY3

    括号序列(bracket) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的 ...