转自C语言预处理运算符

预处理还需要运算符?有没有搞错?

^_^, 没有搞错,预处理是有运算符,而且还不止一个:

  1. #(单井号)    —— 字符串化运算符。
  2. ##(双井号 )—— 连接运算符
  3. #@               —— 字符化运算符。

接下来我们会分别说明一下他们的用法.

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语言预处理运算符的更多相关文章

  1. C语言 预处理二(宏定义--#define)

    //#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 ...

  2. 面试问题4:C语言预处理包括哪些

    问题描述:C语言 预处理包括哪些操作 C语言的三种预处理包括:宏定义(#define).文件包含(#include).条件编译(#if.#else.#endif). 对于宏定义的介绍: 宏定义必须写在 ...

  3. 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出

    [源码下载] 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 预处理命令 输入 ...

  4. C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  5. C语言预处理指令的初步了解

    所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分 ...

  6. C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...

  7. go语言的运算符

    什么是运算符:运算符用于在程序运行时执行数学或逻辑运算 go语言的运算符如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 一,算数运算符 运算符 描述 实例 + 相加 A ...

  8. C语言的运算符的优先级与结合性+ASCII表

    [0]README 0.1) 内容来源于 C程序设计语言, 旨在整理出C语言的运算符的优先级与结合性, 如下图所示(哥子 记了大半年都没有记住,也是醉了,每次都要去翻): Alert)以下内容转自:h ...

  9. 3014C语言_运算符

    第四章 运算符 4.1 分类 C语言的运算符范围很广,可分为以下几类: 1.算术运算符:用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(%).自增(++).自减(--)共七种. 2 ...

随机推荐

  1. Matlab命令eig

    在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有5种: (1) E=eig(A):求矩阵A的全部特征值,构成向量E. (2) [V,D]=eig(A):求矩阵A的全 ...

  2. 非XA式Spring分布式事务

    Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...

  3. [原] Unity下的ElectroServer的连接

    ES的版本是5.4.1,示例目录下code_examples\ConnectAndLoginManually是Unity的连接和登录代码. 除了host和port需要指定,在连接时需要指定连接方式,如 ...

  4. Ubuntu 安装php mcrypt

    sudo apt-get install php5-mcrypt libmcrypt4 libmcrypt-dev sudo php5enmod mcrypt sudo /etc/init.d/apa ...

  5. js观察者模式

    观察者模式存在观察者和被观察者 被观察者的状态发生改变,通知观察者调用观察者的update方法,观察者的update方法对被观察者的状态进行检测,做出相应的操作 被观察者存在接口attach,deta ...

  6. 搭建高可用的MongoDB集群

    http://www.csdn.net/article/2014-04-09/2819221-build-high-avialable-mongodb-cluster-part-1/1 在大数据的时代 ...

  7. VS 2015 (RC)下Entitiy Framework 升级后CodeFirst命令不能使用

    前阵子闲的没事吧自己项目的Entitiy Framework 升级到6.1.3了,然后紧接着问题来了: Join-Path : 无法将参数绑定到参数“Path”,因为该参数是空值. 所在位置 F:\S ...

  8. ASPxGridView动态创建表格列编辑模板

    在项目中用到了DevExpress的ASPxGridview控件,每每去配置它的时候,总感觉很是啰嗦,于是想到了用代码自动配置. 于是有了这样的代码: foreach (ZiyuWeb.Entity. ...

  9. Shell中read的选项及用法

    1. Read的一些选项 Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项. -a :将内容读入到数值中 echo -n "Input muliple ...

  10. sql 理解视图

    可以看作是定义在sqlserver上的虚拟的表,本身并不存储数据,仅仅存储一个select语句和涉及的表的引用 通过视图,客户端不再需要知道底层表结构和其之间的关系,视图提供了一个统一访问数据的接口 ...