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,中间夹着一个结构体名称.大括号里面 ...
随机推荐
- MySql基础学习-数据操作
对于数据的操作,无非是“增删该查”这几种操作. 1增加 数据的增加使用insert语句插入 语法:INSERT INTO TABLE_NAME(column1,column2,...)VALUES(v ...
- android横屏布局文件设置
一.AndroidManifest.xml配置 1.在AndroidManifest.xml的activity(需要禁止转向的activity)配置中加入 android:screenOrient ...
- 12-THREE.JS 自然光
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- TreeView的用法总结
1.循环往treeview中添加数据 public AuthorNavUserControl() { InitializeComponent(); LoadTrees(MainForm.Project ...
- OpenCV教程【001 Mat显示图片】
#include <opencv2\opencv.hpp> #include <iostream> #include <string> using namespac ...
- 二、python沉淀之路~~字符串属性(str)
1.capitalize的用法:即将输出字符串首字母大写 test = "heLLo" v = test.capitalize() print(v) 结果:Hello. 2.cas ...
- STL理论基础、容器、迭代器、算法
一.STL基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段 ...
- Unity3D自定义资源配置文件
http://blog.csdn.net/candycat1992/article/details/52181814 写在前面 我竟然最近两天才知道Unity中ScriptableObject的存在… ...
- Visualforce Page CSS样式
Salesforce Page开发者文档:https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_stylin ...
- python 修改文件内容
python 修改文件内容 一.修改原文件方式 1 def alter(file,old_str,new_str): 2 """ 3 替换文件中的字符串 4 :param ...