• 网站刚刚上线,难免有不足的地方,敬请谅解!欢迎提出宝贵意见!

  •    3年前 (2015-07-26)  C基础 |   2 条评论  119 
    文章评分 1 次,平均分 5.0

    上一篇我们讲的聊聊C语言-我的地盘我做主,相信大家对变量的存储类型和变量的作用域有了一定的了解。现在我们马上公布上期的答案如下:

    #include<stdio.h>

    int a=1;//存储在程序的数据段

    int b;//存储在程序的bss段

    int main(void)

    {

    auto int a=2;//存储在栈中

    static int c=2;//存储在数据段

    {

    int c=3;//存储在栈中

    int b=4;//存储在栈中

    }

    printf("a=%d b=%d c=%d\n",a,b,c);

    return0;

    }

    打印输出为:a=2 b=0 c=2

    亲们不知道做对没有?呵呵

    接下来进入我们这篇的主题-聊聊C语言中预处理功能中的宏定义。

    【C语言基础】聊聊C语言(8)-兵马未动粮草先行(1)

    C代码如何变成可执行程序?

    一 般来说一段代码变成一个可以运行的程序是需要编译器进行处理的,而编译器对C语言的处理的过程包括四个:预处理->编译->汇编->链 接。经过这四个步骤你的代码就可以变成可执行文件。预处理主要是对宏定义,文件包含,条件编译进行处理;编译是把汇编语言编译成汇编文件;汇编是把生成的 汇编代码汇编成目标文件;链接是把我们的目标文件链接成一个可执行文件。编译器对于宏的处理是放在第一阶段的,可见它的重要性。

    什么是宏?

    一般说来,宏是一种规则或模式或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。C语言的宏预处理器的工作只是简单的文本搜索和替换。

    C语言怎么定义宏?

    在C语言中定义宏我们用的关键字是#define

    【C语言基础】聊聊C语言(8)-兵马未动粮草先行(1)

    C语言中宏定义的分类

    • 不带参数的宏定义格式:#define 标识符  字符串其中的标识符就是所谓的符号常量,也称为“宏名”。如:#define  PI   3.1415926
    • 带参数的宏定义格式:#define宏名(参数表)字符串如:#define  S(a,b)  a*b

    C语言中宏定义需要注意的问题

     

    • 宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
    • 宏定义不分配内存,变量定义分配内存。
    • 宏名一般用大写
    • 宏名和参数的括号间不能有空格
    • 可以用#undef命令终止宏定义的作用域
    • 宏替换只作替换,不做计算,不做表达式求解
    • 宏定义末尾不加分号;
    • 函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
    • 宏定义可以嵌套
    • 宏定义不存在类型,也没有类型转换。
    • 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
    • 宏展开使源程序变长,函数调用不会
    • 字符串""中永远不包含宏
    • 宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

    【C语言基础】聊聊C语言(8)-兵马未动粮草先行(1)

    C语言中宏的使用

    • 用无参宏定义一个简单的常量例:#define  LEN 20
    • 带参宏一般用法例:#define  MAX(a,b)((a)>(b)?(a):(b))
    • 有参宏定义中#的用法#用于把宏定义中的参数两端加上字符串的""如:#define STR(str) #str 那么STR(coder_online)会被替换成"coderonline"
    • 有参宏定义中##的用法##用于将字符链接起来如:如果有#define FUN(a,b)  co##on##b 那么FUN(der,line)会被替换成coderonline
    • 多行宏定义用"\"链接多行如:#define NAME coder \_online

    我们的宏定义就讲到这里,大家有什么不明白的或者有什么意见可以关注下面的微信公众号,我们一起在线讨论。下面是针对这篇小编为留的练习题,请实现如下宏答案会在下一篇公布:

    • 用带参数的宏实现求两个数的最小值
    • 用宏定义一个字符串常量
    • 用带##的宏实现两个字符串的链接

    下一篇我们开始讲讲C语言的预处理文件包含和条件编译即聊聊C语言-兵马未动粮草先行(2),期待大家的捧场。

    大家如果对编程感兴趣,想了解更多的编程知识,解决编程问题,想要系统学习某一种开发知识,我们这里有java高手,C++/C高 手,windows/Linux高手,android/ios高手,请大家关注我的微信公众号:程序员互动联盟or coder_online,大牛在线为您提供服务。

    【C语言基础】聊聊C语言(8)-兵马未动粮草先行(1)

     

    本文原始地址:http://www.coderonline.net/c-language-talk-c-8-troops-and-horses-and-fodder-1.html

    本站所有文章,除特别注明外,均为本站原创,转载请注明出处来自http://www.coderonline.net/

    否则保留追究法律责任的权利!

    关于

    发表评论

    表情 格式
    1. 中路也是最难打的一条路,要通过三关七寨,还有十座主城,才能打到赵国都城,至于那些小城就不用说了,欧阳傲枫也没时间去仔细计算。

      名门棋牌室电话号码 评论达人 LV.1 1个月前 (05-12) [0] [0]
    2. 白上将也傻了眼,出动了这多的坦克与汽车,也就意味着进攻方,一次性的投入了近三千战斗部队。

      威尼斯人网址担保 评论达人 LV.1 3个月前 (04-07) [0] [0]
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册