C语言预处理运算符
预处理还需要运算符?有没有搞错?
^_^, 没有搞错,预处理是有运算符,而且还不止一个:
- #(单井号) —— 字符串化运算符。
- ##(双井号 )—— 连接运算符
- #@ —— 字符化运算符。
接下来我们会分别说明一下他们的用法.
1.字符串化运算符 —— #
用于创建字符串,#运算符后面应该跟一个形参(中间可以有空格或Tab),例如:
#define STR(s) #s
puts(STR(Here is a Demo)); // 相当于puts("Here is a Demo");
常用实例:
我们的调试代码的时候有时需要打印一些字符串的值,如下:
#include<stdio.h>
#define Dump_Str(s) printf("%s = %s\n",#s,s); int main()
{
const char * pchName = "Gui xue";
Dump_Str(pchName);
}
2.连接运算符 —— ##
用于将两个Token连接成一个Token; 这里提到一个需要概念Token
,先说明一下:
什么是Token?
人与人之间的沟通,通过说话,而每句话便是由单词组合在一起,形成特定的语义。这里的单词便可理解成 Token。
C语言编译器相当于一个翻译,要懂两种语言——C语言和机器语言;它的工作是将C语言翻译成机器语言。首先它应该读懂C语言中的“句子”,而对整个“句子”的理解,是建立在对每个“单词”理解的基础上的,所以首先我们要把句子分成多个单词——分词。
词法分析便是将C语言的“句子”按照词法规则拆分成 Token 序列。
例如:
#define __CONCAT(x,y) x ## y
int n1 =15;
int n2 =200;
__CONCAT(n,1); // n1
__CONCAT(n,2); // n2
常见用法:glib库中
stdint.h (sysdeps\generic):150: #define __INT64_C(c) c ## L
stdint.h (sysdeps\generic):151: #define __UINT64_C(c) c ## UL
将某个常量后自动加上 L或UL,达到数据类型强制转换的目的。
3.字符化运算符—— #@
用于创建一个字符,类似 ## ,注: 非 ANSI-C中的特性,GCC不支持,VC可以; 使用实例如下:
#include<stdio.h>
#define Dump_Str(s) printf("%s = %s\n",#s,s);
#define Dump_Char(c) #@c
int main()
{
printf("%c\n",Dump_Char(g)); //g
printf("%c\n",Dump_Char(guix)); //x 可以输入 4个长度的字符,但只输出最后一位
printf("%c\n",Dump_Char( guix )); //x 默认去除前后空格,保留中间空格
printf("%c\n",Dump_Char(guixu)); //error C2015: too many characters in constant
}
C语言预处理运算符的更多相关文章
- C语言 预处理二(宏定义--#define)
//#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 ...
- 面试问题4:C语言预处理包括哪些
问题描述:C语言 预处理包括哪些操作 C语言的三种预处理包括:宏定义(#define).文件包含(#include).条件编译(#if.#else.#endif). 对于宏定义的介绍: 宏定义必须写在 ...
- 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出
[源码下载] 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 预处理命令 输入 ...
- C语言位运算符:与、或、异或、取反,左移和右移
C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...
- C语言预处理指令的初步了解
所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分 ...
- C语言位运算符:与、或、异或、取反、左移和右移
语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...
- go语言的运算符
什么是运算符:运算符用于在程序运行时执行数学或逻辑运算 go语言的运算符如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 一,算数运算符 运算符 描述 实例 + 相加 A ...
- C语言的运算符的优先级与结合性+ASCII表
[0]README 0.1) 内容来源于 C程序设计语言, 旨在整理出C语言的运算符的优先级与结合性, 如下图所示(哥子 记了大半年都没有记住,也是醉了,每次都要去翻): Alert)以下内容转自:h ...
- 3014C语言_运算符
第四章 运算符 4.1 分类 C语言的运算符范围很广,可分为以下几类: 1.算术运算符:用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(%).自增(++).自减(--)共七种. 2 ...
随机推荐
- 春&风
流光飞舞中,消逝的背影连同流动的人群,早已荒凉. 谁是谁的谁?落入尘世间,只是光阴下面的一粒尘埃. 那些时光,那些爱,渐行渐远. 留在心底,淡淡的思念,如轻风一阵, 吹过 彼此的容颜.
- MYSQL交换两列数据实例
UPDATE cf_2015_company a, cf_2015_company bSET a.cname = b.linkman, a.linkman = b.cnameWHERE a.id = ...
- 收藏2个mongodb connector网址
https://github.com/plaa/mongo-spark https://github.com/mongodb/mongo-hadoop http://codeforhire.com/2 ...
- 设计模式------PROTOTYPE(原型),TEMPLATE(模板)
看链接:http://blog.csdn.net/wuzhekai1985/article/details/6667020.纯属为自己学习所使用. 对于原型模式的理解:就如连接中所说,制作简历时先手写 ...
- c#重要特性之一委托
委托的构成必须满足的4个条件: 声明委托类型: 必须有一个方法包含了要执行的代码: 必须创建一个委托实例: 必须调用(invoke)委托实例 委托包装的方法需要满足以下条件 方法的签名必须与委托一致, ...
- Lodop错误汇总
代码方面 需要修改 LodopFuncs.js 里面的src地址,主要是端口号,端口号需要和服务器里面的程序的端口一样.如下: 调试错误 可以通过查看调用lodop的地方,查看lodop是否为空( ...
- 【开发】Form Validate 表单验证 扩展应用
目录: ★.文本输入框(easyui-textbox) ★.数字框(easyui-numberbox) ★.时间(easyui-datebox) ★.文本域(easyui-textbox easyui ...
- 【干货分享】.NET单元测试电子书
文章目录: 引言 书籍首页 书籍目录 备注 下载 回到顶部 引言: 平时没有项目压力时候,首先想到的是充电学习,要系统学习都会想到购买书籍,或者向同事借阅.买的书多了烦恼也来了,因为大学到现在5 ...
- JSP九大内置对象(转载)
JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1. ...
- 粵語/廣東話/Cantonese 資料/Material
一.粵語歌詞網 1.海闊天空(粵語) 歌詞 今天我 寒夜裡看雪飄過 gam1 tin1 ngo5 hon4 je6 leoi5 hon3 syut3 piu1 gwo3 懷著冷卻了的心窩漂遠方 waa ...