C语言学习笔记--#和##操作符
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语言学习笔记--#和##操作符的更多相关文章
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- 2017-04-21周C语言学习笔记
C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...
- 2017-05-4-C语言学习笔记
C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- Go语言学习笔记十三: Map集合
Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- Go语言学习笔记十一: 切片(slice)
Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
随机推荐
- R中的基本函数运算
一.均值 1.均值:mean(X)#计算所有元素的均值,包括矩阵.向量 2.行均值:apply(x,1,mean) 3.行均值:apply(x,2,mean) 注:如果x是数据框,则返回的就是向量 e ...
- The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files
要解决的话,方法有两个 1)可以选用较低版本的sdk,比如我就用回1.6版本的sdk window->preferences->Java->Installed JREs->Ad ...
- 深入剖析Redis主从复制
[http://sofar.blog.51cto.com/353572/1413024/] [Redis 主从复制的内部协议和机制] 一.主从概述 Redis 支持 Master-Slave( ...
- Token和session 详解
Token的含义 原文链接 这只是一个思路 1.Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在 ...
- 《Advanced Bash-scripting Guide》学习(五):检查一个可执行文件是否存在
本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 ABS书上的例子是这样的: #!/bin/bash echo hello;ech ...
- 解决mysql登录报错:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
今天在安装一个压缩包mysql-5.7.19时,碰到了一系列问题,现将这些问题罗列出来: 一. ERROR 2003 (HY000): Can't connect to MySQL server o ...
- python字典方法
本文参考自<python基础教程 (第二版)> 操作 语法 举例 结果 建立字典 dict() 1.以关键字参数建立字典 2.以其他映射作为参数建立字典 1.d = dict(name=' ...
- SEM
SEM是Search Engine Marketing的缩写,中文意思是搜索引擎营销.SEM是一种新的网络营销形式.SEM所做的就是全面而有效的利用搜索引擎来进行网络营销和推广.SEM追求最高的性价比 ...
- BZOJ - 2588 Spoj 10628. Count on a tree (可持久化线段树+LCA/树链剖分)
题目链接 第一种方法,dfs序上建可持久化线段树,然后询问的时候把两点之间的所有树链扒出来做差. #include<bits/stdc++.h> using namespace std; ...
- Java 时间工具类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 1.Calendar 转化 String ...