• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 你必须知道的C语言预处理的问题详解

你必须知道的C语言预处理的问题详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了你必须知道的C语言预处理的问题详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

  C语言预处理器执行宏替换、条件编译和文件包含。通常采用以“#”为行首的提示。下面是C语言预处理的应用场合:

  1.三字母词(Trigraph Sequences)

  C源程序的字符集被包含在7位的ASCII字符集中,但是它是ISO 646-1983 Invariant Code Set的超集。为了让程序可以在缩减集(reduced set)中呈现出来,下面的三字母词会被替换成相应的单字符.

三字母词 单字符
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

  替换发生在任何其他处理之前。

  例如:如果你尝试打印字符串"what??!"  

  如果你这样注释代码,结果会让你意外:  

  注意:由于编译器对ANSI C的支持不一样,有些编译器会把三字母词当普通字符处理,你需要给编译选项加上“-trigraphs”

  2.行拼接

  以反斜杠"\"结尾的行会把该行和下一行拼接成一行(预处理器做的工作就是把该反斜杠'"\"和接着的换行字符'\n'删除)。['\'称为续行符]

  例如你可以这样写

  a)简单宏替换

  简单宏替换使程序中能用一个标识符来表示一个单词串,指令形式为:

  注意:字符串常数中出现的与宏名相同的字符串不在替换之列。例如:

  预处理指令的形式为:

  例如:  

    操作符#把其后的串变成双引号包围的串;

    操作符##把两个标志符拼在一起,形成一个新的标识符

int ab=12;
printf(str(hello world!));      // 会被替换成 printf("hello world!");
printf("ab=%d\n", cat(a,b));        // 会被替换成 printf("ab=%d\n", ab);  输出 ab=12
</div>
  ♦宏替换时的顺序  

  (1)在""内的宏名或宏参数名不被替换

  (2)宏替换顺序:一个带参数的宏内部调用另一个宏,参数也是一个宏,则先替换外层的宏,再替换外层宏的参数,最后替换内层宏。

  知道这些规则对于出现上面的结果就不难理解了。

  温馨提示:在写带参数的宏替换指令时,推荐的做法时将单词串中的每一个参数都用()括起来,整个表达式也要用()括起来;否则,替换结果可能不是你想要的,例如:

  c)取消宏定义

  4.文件包含  

  条件编译指令格式如下:

if-line 正文
[#elif 常量表达式 正文]
...
[#else 正文]
#endif

</div>
  if-line为下面中的任意一种形式:

  (1)#if

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28C语言高效编程的几招小技巧
  • 2017-05-28深入探讨C语言中局部变量与全局变量在内存中的存放位置
  • 2017-05-28C++实现遗传算法
  • 2017-05-28使用boost读取XML文件详细介绍
  • 2017-05-28浅析int*p[ ]与int(*p)[ ]的区别
  • 2017-05-28c语言实现词频统计的简单实例
  • 2017-05-28C语言小程序 如何判断两个日期之差
  • 2017-05-28C语言字符串快速压缩算法代码
  • 2017-05-28创建二叉树 二叉树如何删除节点操作教程
  • 2017-05-28C/C++中的typedef和#define详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++11新特性之auto的使用
    • 最长公共子序列
    • C++实现下载的代码
    • C++语言数据结构 串的基本操作实例代码
    • C++实现 vector 的四则运算
    • 浅析C++标准库元组(tuple)源码
    • C语言对栈的实现基本操作
    • C语言结构体数组详解(带实例演示)
    • C++中单链表的建立与基本操作
    • C++中静态存储区与栈以及堆的区别详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有