精华内容
下载资源
问答
  • 系统会自动将’#'开头预处理部分做进行处理处理完毕后进行进入源程序的编译阶段。 C语言中提供多种预处理功能,如宏定义、文件包含、条件编译等。 预定义 在C语言源程序中允许用一个标识符表示符号,称为...

    预处理

    • 文章标题提到的三个概念常常和预处理紧密联系的,所以我们先了解一下程序编译的预处理的步骤。
    • 所谓预处理是指程序进行编译过程的第一个阶段。系统会自动将’#'开头的预处理部分做进行处理,处理完毕后进行进入源程序的编译阶段。它主要处理像宏替换,文件包含、条件编译等部分。

    • C语言中提供多种预处理功能,如宏定义文件包含条件编译等。

    • 宏定义

      • 在C语言源程序中允许用一个标识符表示符号,称为宏,被定义为宏的标识符称为宏名。对程序中出现的所有宏名,都用宏定义中的符号串去替换,这称为宏替换或者宏展开。

      • 常见的宏定义符号表:

        符号 实例 含义
        _FILE_ 正在预编译源文件名
        _LINE_ 文件在当前的行号
        _FUNCTION_ 当前所在的函数名
        _DATE_ 预编译文件的日期
        _TIME_ 预编译文件的时间
        _STDC_ 如果编译器遵循ANSIC,则值为1

    - 宏定义

    • 宏替换是在预处理时自动完成的

    1.无参宏定义

    #define 标识符 字符串
    
    • 宏定义用宏名来表示一串字符串符号,在宏展开的时候又以该符号去替代宏名,这只是一种简单的替换。
    • 宏定义不是声明或语句,在行末不必加分号,如加上分号会连分号一起替换
    • 宏定义的作用域从从宏定义命名起到源程序结束,如要终止其作用域可使用#undef命令来取消宏作用域
    • 宏名在源程序中若用引号括起来则预处理程序则不对其进行宏替换。
    • 习惯上宏名一般用大写字母。
    • 可对输出格式做宏定义,减少麻烦。

    2.带参宏定义

    • C语言中允许宏带有参数,在宏定义中的参数被称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏在调用时不仅要宏展开,而且还要用实参去替换形参。一般形式如下:

      #define 宏名(形参表) 字符串
      
    • 带参宏定义中,宏名和参数表之间不能有空格出现。

      #define MAX (a,b) (a>b)?a:b	//错误例子
      

      这将会被认为是无参宏定义,宏名MAX代表字符串"(a,b) (a>b)?a:b"。

    • 在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义。这与函数中的情况是不同的,在函数中,形参和实参是两个不同的量,各自有各自的作用域,调用时要把实参值赋给形参,进行值传递。而在带参数宏定义中只是符号替换不存在值传递的问题。

    • 在宏定义中,形参是标识符,而宏调用中的实参可以是表达式。这与函数调用是不同的,函数调用时要把实参表达式的值求出来再赋予形参,而宏替换中对实参表达式不做计算直接原样替换。(为避免引起问题,应该在采纳数两侧加括号,还应在整个符号串外加括号)。

    - 文件包含

    • 文件包含语句的功能是把指定的文件插入该语句行位置,从而把指定的文件和当前源程序文件连成一个源文件。

    • 包含形式如下:

      #include "文件名"
      #include <文件名>
      
      • 这两种包含形式的不同点:

        1.使用<>表示的在系统头文件目录去查找(头文件目录可以由用户来指定)。

        2.使用双引号则表示首先在当前源文件的目录查找,若未找到才到系统头文件目录去查找。

        • 一个include命令只能包含一个指定的文件。
      • 文件包含允许嵌套,也就是说如果我们包含的文件中若包含了其他文件,则该文件也是被我们当前文件所包含着的。

    • 条件编译

      • 使编译器按照不同的条件去编译不同的代码,主要由一下三种形式:

        #ifdef 标识符
        程序段1
        #else
        程序段2
        #endif
        

        它表示如果标识符已经被#define语句定义过,则编译程序段1,否则编译程序段2,。如果没有程序段2,则本格式中的#else可以没有。

        #ifndef 标识符
        程序段1
        #else
        程序段2
        #endif
        

        与第一种形式的功能正好相反。

        #if 常量表达式
        程序段1
        #else
        程序段2
        #endif
        

        它的功能是,如果常量表达式的值为真(非0),则编译程序段1否则编译程序段2。因此可以是程序在不同的条件下完成不同的编译的功能。这个特性在很多大型程序中应用比较广泛。

    展开全文
  • 计算机二级C语言编译预处理和动态存储分配知识考点归纳1.1 宏定义(不带参数的宏定义,带参数的宏定义)1.编译预处理就是C源程序进行编译前,由″编译预处理程序″预处理命令行进行处理的过程。2.C语言中,凡是以...

    计算机二级C语言编译预处理和动态存储分配知识考点归纳

    1.1 宏定义(不带参数的宏定义,带参数的宏定义)

    f3f772236360716a154a95ece24993c3.png

    1.编译预处理就是对C源程序进行编译前,由″编译预处理程序″对预处理命令行进行处理的过程。

    2.C语言中,凡是以″#″开头的行,都称为″编译预处理″命令行。C语言中的编译预处命令有:#define,#undef,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#line,#pragma,#error。这些预处理命令组成的预处理命令行必须在一行的开头以″#″号开始,每行的未尾不得加″;″号,以区别于C语句、定义和说明语句。

    3.不带参数的宏定义:命令的一般形式为:

    #define 标识符 字符串

    定义中的″标识符″为用户定义的标识符,称为宏名。在预编译时,C预编译程序将出现的宏名替换成″字符串″的内容,这一过程也称为宏展开。

    4.带参数的宏定义:命令的一般形式为

    #define宏名(形式参数) 字符串

    定义中的″字符串″应包含括号中所指定的`形式参数。注意宏名与括号之间不要加空格,否则就成为不带参数的宏定义了。

    5.预编译时,遇到带实参的宏名,则按命令行中指定的字符串从左到右进行置换,原则是:遇到实参则以实参代替,非形参字符原样保留,从而成展开后的内容。

    1.2 “文件包含”处理

    1.文件包含的一般形式为:

    #include″头文件名″

    #include

    头文件名一般由C语言提供,也可以是用户自己编写的,头文件通常用.h作为后缀。

    2.当头文件名用双引号括起来时,系统首先在使用此命令的文件所在的目录中查找被包含的文件,找不到时,再按系统指定的标准方式检索其它目录;当头文件名用尖括号括起来时,则直接按系统指定的标准检索方式查找被包含的文件。

    3.预编译时,将被包含文件的内容全部复制到包含文件中,这就是文件″包含处理″。

    1.3 条件编译

    C语言中的条件编译命令可对源程序代码的各部分有选择地进行编译。条件编译主要有如下3种使用格式:

    使用格式1:

    #ifdef标识符

    程序段1

    #else

    程序段2

    #endif

    使用格式2:

    #ifndef标识符

    程序段1

    #else

    程序段2

    #endif

    使用格式3:

    #if表达式

    程序段1

    #else

    程序段2

    #endif

    使用格式1表示如果已定义了“标识符”,则编译“程序段1”,否则编译“程序段2”;使用格式2表示如没有定义了“标识符”,则编译“程序段1”,否则编译“程序段2”;使用格式3表示如“表达式”的值为“真”时,则编译“程序段1”,否则编译“程序段2”。

    【计算机二级C语言编译预处理和动态存储分配知识考点归纳】相关文章:

    展开全文
  • C语言学习:宏定义#define ...当一个源文件进行编译时,系统将自动引用预处理程序源程序中预处理部分作处理处理完毕自动进入源程序的编译。 宏定义: 在C或C++语言源程序中允许用一个标

    C语言学习:宏定义#define

    define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便。

    预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等。一般都放在源文件的前面,它们称为预处理部分。

    所谓预处理是指在进行编译之前所作的工作。预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。

    宏的定义:

    在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

    下面介绍几种#define的用法:
    一、用于定义常量

    //一般用法:
    #include <stdio.h>
    #define PI 3.14 
    int main()
    {
    	double R = 2.0;	   //定义圆的半径并初始化为2.0
    	double Area = 0.0;//定义圆的面积并初始化为0.0
    	Area = PI*R*R;    //圆的面积等于π*R的平方
    	printf("%.2lf",Area);//保留2位小数输出Area的值
    	return 0;
    }
    

    上述例子中,π在main函数中并未赋值也为定义,但是确能够准确输出圆的面积,正是因为在开头使用了#define 定义了PI为3.14,经过宏定义后,在程序中只要出现PI这个字符串,系统都会默认将其用3.14替换掉,这便是宏定义最简单的应用。

    二、用于定义一种方法

    #include <stdio.h>
    #define fun(A) A*A
    int main()
    {
    	int a = 10;         //定义一个临时变量a并初始化为10
    	int result = 0;     //定义一个临时变量resul用于储存结果
    	result = fun(a);    //将宏定义计算后的结果存储于resul中
    	printf("%d",result);//输出result的结果
    	return 0;
    }
    
    

    看出上述例子输出的结果为100,将fun(A)这个字符串用A*A替换了,这便是宏定义的第二种用法,用于定义一种方法。值得注意的是下面这个例子。

    #include <stdio.h>
    #define fun(A) A*A
    int main()
    {
    	int a = 10;         //定义一个临时变量a并初始化为10
    	int result = 0;  //定义一个临时变量resul用于储存调用宏定义后的结果
    	result = fun(a);    //将宏定义计算后的结果存储于resul中
    	printf("%d\n",result);//输出result的结果
    	result = 100/fun(a);
    	printf("%d\n",result);
    	return 0;
    }
    
    

    在这里插入图片描述

    这个例子的第二部分输出的不是1却是100!
    原因:result = 100/fun(a)被替换后变成了
    result = 100 / 10x10=> result=10x10=100。
    因为宏定义方法时,程序只负责替换对应字符串并不帮忙加括号控制优先顺序。

    若要输出1,这应该这样写代码。
    将#define fun(A) AxA 变为 #define fun(A) (AxA)

    #include <stdio.h>
    #define fun(A) (A*A)   //将其括起来
    int main()
    {
    	int a = 10;         //定义一个临时变量a并初始化为10
    	int result = 0;     //定义一个临时变量resul用于储存调用宏定义后的结果
    	result = fun(a);    //将宏定义计算后的结果存储于resul中
    	printf("%d\n",result);//输出result的结果
    	result = 100/fun(a);
    	printf("%d\n",result);
    	return 0;
    }
    
    

    在这里插入图片描述
    结果便是我们想要的1了,具体流程为:
    result = 100/fun(a) => result = 100/(10x10) =>result = 100/100 = 1.

    总结:#define [想替换的字符串] [目标字符串]
    字符串的宏定义方法就是将想替换的字符串在程序中用目标字符串来替换掉,实现更好的代码可读性与可重写性。
    (在宏定义方法时,要注意括号的添加与否,是否会修改源程序的优先顺序。)

    展开全文
  • 源文件进行编译时,系统将自动调用预处理程序源程序中预处理部分作处理处理完毕自动进入源程序的编译。 5.C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理使用它们会使编写程序...

    C语言之预处理指令和宏定义

    一.预处理命令基本介绍

    1.以#号开头的命令称为预处理命令。
    2.在编译之前对源文件进行简单加工的过程,就称为预处理。
    3.预处理主要是处理以#开头的命令,它的位置要放在所有函数之外,而且一般都放在源文件的前面。
    4.预处理是C语言的一个重要功能,由预处理程序完成。当对源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。
    5.C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理的使用它们会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程序。
    eg:
    开发一个C语言程序,让它暂停5秒后输出,并且要求跨平台,在Windows和Linux下
    都能运行。
    在这里插入图片描述

    二.C语言之宏定义的基本介绍

    1.#define 叫做宏定义命令,它也是C语言预处理命令的一种。宏定义,就是用标识符来表示一个字符串,代码中出现了标识符就全部替换成了指定字符串。
    2.宏定义的形式(#define 宏名 字符串)
    说明:
    (1)宏名的命名规则和变量相同。
    (2)字符串可以是数字,表达式,if语句,函数等。
    (3)字符串不需要加双引号
    (4)程序中反复使用的表达式就可以使用宏定义
    eg:
    #define N 100
    N为宏名,100是宏的内容(宏所表示的字符串)

    三.宏定义的注意事项和细节

    1.宏定义只是作简单替换,若有错误,只能在编译已被宏展开后的源程序时被发现。
    2.注意宏定义结尾没有分号。
    3.宏定义必须在函数外,作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。
    eg:
    #define PI 3.1415926
    int main()
    {
    printf(“PI = %.2f”,PI);
    return 0;
    }
    #undef PI //取消宏定义,取消后下面就不能使用到PI了
    4.宏定义允许嵌套。
    5.宏名若被双引号包围,则不会对其作宏代替。
    6.习惯上宏名用大写字母表示,以便与变量区别。但也允许小写。
    7.可用宏定义表示数据类型,使书写方便。
    eg:
    #define UINT unsigned int
    void main(){
    UINT a,b;
    }
    8.宏定义表示数据类型和用typedef定义数据说明符的区别:
    宏定义只是简单的字符串替换,由预处理器来处理;typedef是在编译阶段由编译器处理的,它并不是简单的字符串替换,而是给原有的数据类型起了一个新的名字,将它作为一种新的数据类型。

    四.带参数的宏定义基本介绍

    1.C语言允许宏带有参数。宏中定义的参数称为“形式参数”,在宏调用中用的参数称为“实际参数”。
    2.对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。
    3.带参宏定义的一般形式为:
    #define 宏名(形参列表) 字符串
    eg:
    #define MAX(a,b) (a > b) ? a : b
    4.带参宏调用的一般形式为:
    宏名(实参列表)
    eg:
    在这里插入图片描述

    五.带参宏定义的注意事项和细节

    1.宏名和形参列表之间不能有空格出现。
    2.在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型。而在宏调用中,实参包含了具体的数据,要用它们去替换形参,因此实参必须要指明数据类型。
    3.字符串内的形参通常要用括号括起来以避免出错。
    eg:
    #define MAX(a,b) (a>b)?(a):(b)

    六.带参宏定义和函数的区别

    1.宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。
    2.函数是一段可以重复使用的代码,会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。
    eg:
    在这里插入图片描述

    七.C语言之预处理命令总结

    预处理指令是以#号开头的代码行,#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符,整行语句构成一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
    一些预处理命令总结如下图:
    在这里插入图片描述

    展开全文
  • c语言预处理宏定义

    2017-07-18 21:02:25
    1. 预处理概述 预处理也称预编译,是整个编译过程最先...C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等。合理 地使用预处理功能编写程序便于阅读、修改、 移植和调试,也有利于模块 化程序设计。预处理
  • 预处理器介绍:就是三个方面,宏定义,文件包含和条件编译 0:预处理是一个小软件,可以在编译器编译程序之前源程序进行编辑,例如出书之前,编辑线看看你这个书写通不通顺 1:预处理器可以处理一些预编译...
  • 一个源文件进行编译时,系统将自动调用预处理程序文件中与处理部分进行处理,完成后才进入源程序的编译。 所谓宏定义,是使用一个标识符来表示一个字符串。宏有两种,一种是不带参数宏,一种是带参数...
  • C语言 习题

    千次阅读 2019-05-13 09:33:32
    C语言 习题 1.C语言程序设计中,宏定义有效范围从定义处开始,到源文件结束处结束。但可以用来提前解除宏定义作用的是 ...2.C语言编译系统对宏定义的处理是 B A.和其它C语言语句同时进行; B.在对其成分正式编译之前处...
  • 单项选择题 在宏定义#define A) 单精度数 符串 以下叙述中正确的是 A)预处理命令行必须位于源文件的开头 多条预处理命令 C)宏名必须用大写字母表示 时间 C语言编译系统对宏命令的处理( A) B) C) D) 3. 4. 5. 中宏...
  • C语言的编译过程

    2021-03-30 21:56:40
    1.使用c编译系统提供预处理器预处理指令进行处理(.h文件,宏定义等) 2.检测C语言文件中程序语法,若无错误即将源程序转换为二进制目标程序(.obj文件) 3.将所有源文件进行连接处理,生成可执行文件(.exe...
  • 我们在写代码时已多次使用过以“#”号开头预处理命令。如包含命令#include,宏定义命令#define等。在源程序中这些命令都放在...当一个源文件进行编译时,系统将自动引用预处理程序源程序中预处理部分作处理
  • C语言宏

    2019-12-08 17:05:02
    一个源文件进行编译时,系统将自动引用预处理程序源程序中预处理部分作处理处理完毕后自动进入源程序的编译。 程序中以“#”开头预处理命令,如包含命令#include,宏定义命令#de...
  • C语言宏详解

    千次阅读 2016-08-14 23:59:11
    一个源文件进行编译时,系统将自动引用预处理程序源程序中预处理部分作处理处理完毕后自动进入源程序的编译。 程序中以“#”开头预处理命令,如包含命令#include,宏定义命令#define等。在源
  • 一个源程序进行编译时,系统将自动引用预处理程序源程序中预处理部分进行处理(代替),处理完毕自动进入源程序的编译C语言宏定义C语言源程序中允许用一个标识符来表示字符串,称为宏。宏定义是以...
  • PAGE PAGE 3 编译预处理习题 单项选择题 在宏定义#define A 3.897678中宏名A代替...C宏名必须用大写字母表示 D宏替换不占用程序的运行时间 C语言编译系统对宏命令的处理 A 在程序运行时进行的 B 在程序连接时进行的 C
  • 预处理——宏定义

    2020-01-09 16:01:09
    一个源文件进行编译时,系统将自动引用预处理程序源程序中预处理部分作处理处理完毕自动进入源程序的编译C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。 本文介绍宏定义,文件包含...
  • 宏定义基本概念预处理部分: #include #define 放在函数之外,一般都放在源文档前面预处理由预处理进程负责,当一个源文档进行编译时,系统将自动引用预处理进程源进程中预处理部分作处理,处理完毕将自动进入...
  • 第 7 章编译预处理命令 学习目标熟练掌握宏定义和宏替换的一般方法熟练文件包含的处理方法3. 了解条件编译的作用和实现方法主要内容宏文件包含处理条件编译7.1 #define命令 一. 编译预处理命令的作用 编译预处理命令...
  • gcc编译系统

    2018-04-12 08:35:28
    一、 C语言编译过程 C语言编译过程可分为四个阶段: 1、预处理(Preprocessing) 源程序中伪指令(即以#开头指令)和特殊符号进行处理的过程。 伪指令包括:1)宏定义指令;  2)条件编译指令;  3)...
  • C语言中define用法

    2012-12-24 11:04:07
    一个源文件进行编译时,系统将自动引用预处理程序源程序中预处理部分作处理处理完毕自动进入源程序的编译宏的定义 在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“”。被定义为...
  • C语言预处理

    千次阅读 2018-07-10 19:57:26
    编译一个程序时,系统将自动调用预处理程序程序中“#”号开头预处理部分进行处理处理完毕之后可以进入源程序的编译阶段。2.C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。预定义符号:在...
  • 所谓预处理是指在进行编译... C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能编写程 序便于阅读、修改、移植和调试,也有利于模块化程序设计。本章介绍常用几种预处理功能。
  • 以符号“#”开头的命令,如: #define N 10; #define <stdio.h>...C编译系统的预处理功能主要包括宏的处理、文件包含的处理、条件编译的处理三种。所有预处理命令均以“#”开始,末尾不加分号,以区别
  • 当一个源文件进行编译时,系统将自动引用预处理程序中预处理部分进行处理处理完毕自动进入源程序的编译C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理地使用预处理功能编写程序便于...
  • 一个源文件进行编译时,系统将自动引用预处理程序源程序中预处理部分做处理处理完毕自动进入源程序的编译C语言提供多种预处理,如宏定义、文件包含、条件编译等。   一、 宏定义   带参宏定义 ...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 149
精华内容 59
关键字:

c语言编译系统对宏定义的处理

c语言 订阅