zoukankan      html  css  js  c++  java
  • 我也要学C语言第十二章:编译预处理——不带参数的宏

      哈哈!今天上午学了不带参数的宏!感觉特好玩。怎么好玩的,后面你就知道啦! 

      C语言的宏是用来间接的操作编译环境的。

      C语言在对源程序进行正常编译之前,先对一些特殊的预处理命令作解释,产生一个新的源程序,之后再进行通常的编译(要得到中间文件加参数/p)。

      在源程序中,为了区分预处理命令和一般的C语句的不同,所有预处理命令行都以符号#开头并且宏一定要大写哦,因为大家都是这样做的,并且结尾不用分号。

      预处理命令可以出现在程序的任何位置,但是习惯上尽可能地写在源程序的开头,其作用范围从其出现的位置到文件尾。

    不带参数的宏定义:

      #define 标识符 语句序列或者表达式

      它的作用是在编译预处理时,将源程序中所以标识符替换成语句序列。

      宏常常用来定义符号常量,简化一些标识符的书写,部分的弥补了C语言没有元素个数可变的数组的不足:例子:

    #include <stdio.h>
    #define IN scanf
    #define OUT printf
    #define N 2

    void main()
    {
    int i =0;
    char name[N][20];
    long num[N];

    OUT(
    "Please input name and ID:\r\n");

    for(i; i<N; i++)
    {
    IN(
    "%s", name[i]);
    IN(
    "%ld", &num[i]);
    }

    for(i=0; i<N; i++)
    {
    OUT(
    "%s\t", name[i]);
    OUT(
    "%ld\r\n", num[i]);
    }
    }

    我们把这段代码在VC6.0中编译不链接,编译不链接在VC6.0IDE的设置是这样的,打开:

    在Project Options后面加上/P参数。这样你选择只编译

    就可以就得到编译预处理后的.i文件。我们再打开.i文件看看:

    我们可以看到,N都被替换为2了,IN都替换为scanf了,OUT被替换为printf啦!所以这样的控制编译器预处理的语句通常叫预处理命令!

    不带参数的宏的好玩的地方。看代码:

      

    #include "stdio.h"
    #define dodolook

    int g_a1 =0x12345678;

    staticint g_a2 =0x87654321;

    dodolook
    void go()
    {
    //?x@?1??go@@YAXXZ@4HA
    staticint x =0x88888888;

    printf(
    "%08x", x);
    }

    int main()
    {
    //?x@?1??main@@9@4HA
    staticint x =0x12312312;
    int a =111;
    int b =222;

    dodolook go();

    return (0);
    }

    嘿嘿!以后啊只要是我写的函数,我都要加上一个名字!其实这样做并不是臭美呢!因为这样其实可以提高程序的可读性。

      今天上午我提前学习了下指针(因为害怕过不了这个坎,但是我有信心)所以笔记就写的这个,算是非常简单的了,求求编辑不要因为书写时间刚好50几分钟就把这个笔记给删除啦!(嘿嘿!因为其他两项都符合要求:1是大家都知道不带参数的宏是什么意思,但是我想一般大家都没有自己去打开过预处理过的文件去看看究竟,因为我在各大学的C语言教程中没有见过1次。2是通过在函数前面写名字带来了可读性更好的优势!应该这个是正确的,因为我搜寻到微软官方同样这样做了。)下午呢!继续写带参数的宏的笔记,昨天有个好朋友说,最近2天我写的学习笔记他看得晕了,我想其实也有我的错啦!因为最近2天有些知识我没有一步一步的截图,代码。我现在尽量写得更细致。让大家一起快乐的学习编程!虽然我写的好多东西都非常的基础,程序员们基本上都不屑一顾的!但是我的目标是,通过写笔记提高自己的专注度,以及和那些刚刚比我晚几天学习编程或者已经编程很多年的人带来更高效率的同步学习和一些轻松与愉快。

  • 相关阅读:
    js上传图片预览
    Android 调用QQ登录
    未开启HugePages ORACLE session剧增时引起的一次悲剧
    脱了裤子放屁之std::string
    [Python爬虫] Selenium自己主动訪问Firefox和Chrome并实现搜索截图
    tomcat启动报错,找不到相应的 queue,从而引发内存泄漏
    LeetCode: Binary Tree Postorder Traversal [145]
    素数打表法。
    linux 抓包 tcpdump 简单应用
    Linux命令之kill
  • 原文地址:https://www.cnblogs.com/dodolook/p/2060103.html
Copyright © 2011-2022 走看看