0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言:条件编译及预定义符号知识详解

C语言编程学习基地 来源:未知 作者:李倩 2018-03-31 09:20 次阅读

一.预定义符号

C标准定义了如下五个预处理符号

在文件输入输出以及输出日志等场合下我们会用到这些预处理符号,比如

\+回车 : 续行符,转义字符,后面不能加任何除回车之外的字符,否则会报错

二.#define关键字

#define有两个作用,一个是定义标识符,第二个是定义宏

1.定义标识符

不要在define定义的标识符里加分号

2.定义宏

#define机制包括一个规定,允许把参数替换到文本中,这种实现通常叫做宏或定义宏

宏定义永远不要吝啬括号,防止因为优先级的问题导致出现不可思议的后果 宏不能实现递归 宏只文本替换,并不简化计算 字符串中的内容不会发生宏替换

3.#和 ##

编译器会自动就两个相邻字符串自动连接成一个

#:把参数插入到字符串中

#a -> “a”

##可以把位于它两边的符号拼成一个符号

4.宏和函数对比

①宏没有类型检查

没有类型检查是宏的一大特点(但同时也是不安全的隐患),可以完成很多函数不可能做到的功能

②宏没有函数的调用和返回等额外开销,效率更高,

但是当逻辑复杂并且代码量巨大时,调用和返回的开销和运算的时间相比微乎其微,可以省略

③宏单纯只是文本替换,不能进行调试,很致命

④宏可能会使代码长度增长

⑤函数的参数如果是一个表达式,会计算出表达式的结果传入参数

宏的参数如果是一个表达式,只会文本替换,不会进行计算

总结:各有千秋,小代码量使用宏,大代码量使用函数,C++中摈弃宏这一概念,使用内联,基于优缺点,最好不要使用宏

5.带有副作用的宏参数

不要给宏参数传入带有副作用的参数

6.命名约定

宏:全部大写

函数: 不全部大写

例外

#undef name //取消宏标识符name的定义

三.条件编译

1.如果定义了DEBUG,语句执行,反之,不执行

2.条件编译

3.多分支条件编译

3.判断是否被定义

4.嵌套指令

预处理指令可以进行嵌套

四.其它

1.头文件的包含

2.#error “…”

遇到#error便会产生一个编译错误

3.strcpy();

源字符串必须以’/0’结束,返回目标字符串地址且这个函数不管目标空间是否放得下返回的目标字符串

4.assert(条件语句)

善用断言,头文件为

5.链式反应

这次函数的返回值可以作为下一个函数的参数,达到链式反应的效果

printf(“%d\n”,strlen(strcpy(p,”hello world!”)));

6.常见错误:

编译型错误

直接看编译器错误提示信息即可 链接型错误

函数名,变量名写错,库文件使用错误(第三方库) 运行时错误

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7527

    浏览量

    128173
  • 编译器
    +关注

    关注

    1

    文章

    1575

    浏览量

    48606

原文标题:C语言#define关键字,条件编译及预定义符号知识详解

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言定义与枚举类型知识

    定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。在简单的程序使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,
    发表于 10-11 17:34 1054次阅读

    C语言预定义宏的用法和使用场景

    在C语言中,预定义宏是由编译器提供的一组特殊标识符,可以在程序中直接使用,无需进行额外的定义
    发表于 08-16 16:12 257次阅读

    C语言条件编译的妙用

    线。我对学习总结出一句话“压力不是有人努力,而是比你牛X N倍的人依然在努力” C语言条件编译的应用 一般情况下,源程序中所有的行都要参加编译
    发表于 07-19 01:53

    Predefined Symbols中的预定义名"LARGE_MODEL"是什么作用的?

    Predefined Symbols中的预定义名"LARGE_MODEL"是什么作用的?我删了程序也能编译通过,也能运行,"_DEBUG"是指会编译ESTOP0这些指令吗?如果没有就不编译
    发表于 10-24 15:45

    如何在C语言满足多个条件下进行条件编译

    请教一下各位。在C语言中如果满足多个宏定义条件怎么来进行条件编译呢?今天在写I2
    发表于 11-08 04:35

    【每日一知识点】C语言中const详解

    的内存地址,所以,const定义的只读变量在程序运行过程中只有一份备份,它是全局的只读变量,是存放在静态区的。2、 修饰数组C语言中const还可以修饰数组,举例如下:const int array
    发表于 03-29 10:53

    C语言程序中标识符号的意义

    我是在大一下学期才接触到C语言这个程序设计语言,慢慢了解到C语言对操作系统,单片机,驱动程序,编译
    发表于 07-14 07:53

    C语言符号总览图

    C语言符号总览图C语言符号概述C
    发表于 07-14 07:55

    如何使用C51运行库中预定义

    Read_SP37_ID(unsigned char idata *IDH,unsigned char idata *IDL){*IDH = CBYTE[0x57E0];*IDL = CBYTE[0x57E1];}一.使用C51运行库中预定义
    发表于 12-02 07:55

    介绍一下C语言的预处理知识与宏定义原理

    系统平台上的gcc)前言本篇文章将会向大家介绍一下C语言的预处理知识、宏定义、函数、以及编译执行程序所需的静态链接库和动态链接库的一些原理,
    发表于 02-11 06:35

    C语言基础知识(一)

    封装可重复使用的代码块。函数可以接受参数并返回一个值。以下是定义和调用函数的示例: 复制结论通过本文,大概介绍了C语言的一些基础知识。希望对大家有所帮助! 本文来源于:易百纳技术社
    发表于 08-07 16:51

    C语言基础知识(一)

    封装可重复使用的代码块。函数可以接受参数并返回一个值。以下是定义和调用函数的示例: 复制结论通过本文,大概介绍了C语言的一些基础知识。希望对大家有所帮助! 本文l
    发表于 08-10 15:16

    c语言条件编译技巧与示例分析

    C语言条件编译#if, #elif, #else, #endif、#ifdef, #ifndef 有些程序在调试、兼容性、平台移植等情况下可能想要通过简单地设置一些参数就生成一个不同的软件,这当然
    的头像 发表于 08-26 15:06 2429次阅读

    C语言条件编译语句and单片机DMA的介绍

    C语言条件编译语句and单片机DMA的介绍C语言条件编译:这里面介绍的很详细,也有历程。DMA的
    发表于 11-29 10:36 3次下载
    C<b class='flag-5'>语言</b><b class='flag-5'>条件</b><b class='flag-5'>编译</b>语句and单片机DMA的介绍

    C语言条件编译详解

    —般情况下,C语言源程序中的每一行代码.都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译。此时就需要在程序中加上条件,让
    的头像 发表于 04-14 13:12 2501次阅读