精华内容
下载资源
问答
  • C语言预处理命令

    千次阅读 2018-03-12 16:54:00
    定义: 预处理器在源代码进行编译之前对其进行一些文本性质的操作; 提供以下三种预处理功能: ...注:这些预处理命令是由ANSI C统一规定的,它不是C语言本身的组成部分,不能对其直接进行编译。...

    定义:

    预处理器在源代码进行编译之前对其进行一些文本性质的操作;

    提供以下三种预处理功能:

    1. 宏定义 (#define)
    2. 文件包含 (#include <stdio.h>)
    3. 条件编译 (#if #else #endif #ifndef #ifdef)

    注:这些预处理命令是由ANSI C统一规定的,它不是C语言本身的组成部分,不能对其直接进行编译。


    作用:

    它的任务主要包括删除注释,插入被 #include 指令包含的文件内容,定义和替换由 #define 指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。


    一、宏定义


    1.无参数的宏

    *宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非C标准规定;

    *使用宏名代替一个字符串,可以减少程序中重复书写字符串的工作量;

    *宏定义是用宏名代替一个字符串,只作简单的置换,不作正确性检查;

    *宏定义不是C语句,不必在行未加“;”号,如果加了连“;”号一起进行置换;


    2.带参数的宏

    *对带参数的宏展开只是将语句中的宏名后面括号内的实参字符串代替#define命令中的形参;

    *在宏定义时,在宏名与带参数的括号之间不应有空格,否则将空格以后的字符都作为替代字符串的一部分;


    作用域:

    *宏名的有效范围为定义命令之后到本源文件结束,可以用#undef NAME终止宏定义的作用域;


    带参宏和函数的区别:

    *函数调用时,先求出实参表达式的值再代入形参,而带参宏只进行简单的字符替换;

    *函数调用是在程序运行时处理的,为形参分配内存空间。而宏展开是在编译前进行的,在展开时并不分配内存空间,不进行值传递,也没有返回值;

    *对函数中的实参和形参都要定义类型,并且要求一致;而宏不存在类型问题;

    *使用宏会使源程序变长,而函数调用不会;

    *宏替换不占运行时间,只占编译时间。而函数调用则占用运行时间(分配单元,保留现场,值传递,返回)


    字符串拼接

    *利用邻近字符串自动连接的特性:

    *利用预处理器把一个参数转换成为一个字符串,如 #argu 会被 译为 “argu”


    二、条件编译: 条件成立才编译

    #if 常量条件
    #endif //


    #if 常量条件
    #else
    #endif


    #if 常量条件
    #elif 常量条件
    #elif 常量条件
    #else
    #endif


    判断某个符号是否被定义
    #ifdef NR 等价的写法 #if defined NR
    #else
    #endif


    #ifndef NR 等价的写法 #if !defined NR
    #else
    #endif


    三、文件包含:

    将文件内容原样插入到include处 (支持嵌套)

    #include <stdio.h> // 在/usr/include(标准路径)

    #include “stdio.h” // 在当前路径找 如果没有则找标准路径

    #include “/usr/include/stdio.h”

    <>: 在标准路径下查找被包含的文件
    “”: 首先在指定的路径找 如果没找到则找标准路径
    gcc -I path xxx.c: 指定头文件的搜索路径


    关键点:

    预处理命令总共有三种: 宏定义, 条件编译, 头文件包含;

    宏定义: #define, #undef

    #define 只管一行,如果有多行,需要使用换行符’<font color="#">’,对于多行的宏定义,应该使用代码块符号"{}"括起来成为一个代码块.

    宏模拟函数时,由于宏无法像函数那样实现返回值,所以可以使用小括号符号"()",把代码块括起来,这样就通过类似于逗号表达式功能模拟函数返回值,其返回值为最后一条表达式.

    # ##

    ‘#’: 字符串转换符, #a 把参数a宏替换后加上 “” 将其转变为字符串,然后利用相邻字符串会自动粘贴为一个字符串(中间只能为空白符)的特性将其合并到字符串中, 即: #a 变成 “a”, 而"a"“b” == “ab”.("a"和"b"之间只能插入空白符或没有符号)

    ‘##’: 粘贴符, 将宏参数替换出来后与前后字符合并为一体,如: i = 1; 而 ar##i 等价于ar1.

    #unddef 控制宏定义作用域.

    命令行开启宏定义: gcc main.c -D(Define) DEBUG 这样编译的时候就定义了宏 DEBUG, 其默认值为1, 当然可以指定值: DEBUG=255

    条件编译: #if-#else-#endif, #ifndef-#define-#endif, #ifdef-#endif

    #if 后只接真假值(0,1), 为1则编译 #if 下面的程序一直到 #else(如果有的话)或者到 #endif

    #ifdef(#if define) 后接宏定义符号,如果宏定义了该符号则编译下面的程序,否则不编译.

    #error指令 允许生成错误信息

       #ifdef option
          expression
       #else
       #error No option
       #endif


    四、字节对齐

    设置4字节对齐:

    # pragma pack(4)

    取消字节对齐:

    # pragma pack(1)

    恢复默认字节对齐:

    # pragma pack()

    展开全文
  • C语言预处理命令1.0

    2019-04-26 10:53:18
    1.0C语言中以‘#’开头的都是预处理命令。 eg:#include/#define 三种:宏定义、文件包含、条件编译 1.1宏定义(#define):有效提高程序的编程效率、增强程序的可读性、可修改性。 两种形式: 无参宏定义: #define ...

    1.0C语言中以‘#’开头的都是预处理命令。
    eg:#include/#define
    三种:宏定义、文件包含、条件编译
    1.1宏定义(#define):有效提高程序的编程效率、增强程序的可读性、可修改性。
    两种形式:
    无参宏定义:
    #define PI 3.1415926
    #undef PI (终止宏定义的作用)
    有参宏定义;
    #define 宏名(参数表) 字符串

    注意:宏名与参数表之间不能有空格;
    带参宏定义中,形式参数不分配内存单元,不必声明类型;
    宏定义中形参是标识符,而宏调用中的参数可以是表达式;
    宏定义中,字符串内的形参通常要用括号括起来避免错误;
    宏定义嵌套时做层层置换。从前往后执行。
    

    #define F(y) y*y+3
    k=F(5)
    k=f(i+2)
    1.2文件包含:
    #include<文件名>
    #include"文件名"

    展开全文
  • C语言预处理命令

    2019-08-13 19:26:29
    它是预处理功能中三种(宏定义,文件包含和条件编译)中的第三种--条件编译。 #ifndef X //先测试是否被宏定义过 #define X 程序段1//如果X没有被宏定义过,定义X,并编译程序段1; #else 程序段2 //如果X已经...

    #ifndef 

    ifndef是 if not define 的缩写,一种宏定义。它是预处理功能中三种(宏定义,文件包含和条件编译)中的第三种--条件编译。

    #ifndef X  //先测试是否被宏定义过
    #define X 
    程序段1//如果X没有被宏定义过,定义X,并编译程序段1;
    #else
    程序段2 //如果X已经定义过了则编译程序段2 的语句,忽视程序段1;
    #endif

    条件指示符#ifndef的最主要目的是防止头文件的重复包含和编译;

    #ifndef和#endif一起使用,不能存在丢失;

    注意:

    假如你有一个C源文件,它包含了多个头文件,比如头文件A和头文件B,头文件B又包含了头文件A,则最终该源文件包含了两次头文件A。如果你在头文件A里定义了结构体或者类类型(这是最常见的情况),那么,编译时会报大量的重复定义错误

     

    展开全文
  • 原标题:C语言预处理命令C语言中,说明语句和可执行语句由来完成程序的功能,除此之外,还有一些预编译处理命令,所有的预编译处理都以#号开头,占用源程序中的一行,一般是放在源程序中的首部。注意:编译...

    原标题:C语言之预处理命令

    在C语言中,说明语句和可执行语句由来完成程序的功能,除此之外,还有一些预编译处理命令,所有的预编译处理都以#号开头,占用源程序中的一行,一般是放在源程序中的首部。

    注意:编译预处理不是C语句,行末不用加分号。

    C语言的预处理指令主要有三种:宏定义、文件包括(就是头文件的 类型)、条件编译。

    我们先来看看宏定义:

    宏定义有两种方式:一种是带参数的宏另一种是不带参数的宏。

    不带参数的宏定义形式:

    # define 宏名 字符串

    例如:# define PI 3.1415926

    1) define是关键字,表示宏定义;

    2) 宏名必须符合标识符的定义,为区别变量,宏名一般采用大写字母。

    3) 宏的作用:在程序的任何地方都可以直接使用宏名,编译器会先将程序中的宏名用字符串替换,然后在进行编译。这称为是宏替换,宏替换并不进行语法检查。

    4) 宏名的有效范围是从定义命令之后,直到源程序文件结束,或者遇到宏定义终止命令#undef为止。

    我们来看一个例子:

    输入半径,求圆的面积:

    #include

    #define PI 3.1415926

    int main()

    {

    double s, r;

    printf("请输入圆的半径r:\n");

    scanf_s("%lf", &r);

    while (r > 0)

    {

    s = r * r * PI;

    printf("圆的面积s为:%lf\n", s);

    printf("请输入圆的半径r:\n");

    scanf_s("%lf", &r);

    }

    return 0;

    }

    带参数的宏:

    带参数的宏的定义形式是:

    # define 宏名(参数表) 字符串

    需要注意的是:字符串中一定要包含有参数表中的参数,只有这样两者才能被联系起来;

    在宏替换时,是将字符串中的参数用参数表中的参数进行替换。

    假如定义了这样的宏:

    # define S(r) 3.1515926*r*r

    在程序中若出现S(3.0),则相当于3.1415926*3.0*3.0.必须注意,这种替换是严格意义上的字符替换。

    若在程序中出现S(3.0+4.0),则相当于3.1415926*3.0+4.0*3.0+4.0。

    也许这样的结果并不是你想要的,因此在设计有参数的宏的时候,有可能会出现二义性,这是应该注意避免的。

    例如:

    #include

    #define F(a) a*b

    int main()

    {

    int x, y, b, z;

    printf("请输入x和y的值:\n");

    scanf_s("%d%d", &x, &y);

    b = x + y;

    z = F(x + y);

    printf("b=%d\nF(x+y)=%d\n", b, z);

    }

    我们输入3和4

    输出结果为:b=7

    F(x+y)=31

    1f1c4412571caf065344fdc0743a582e.png

    

    也许这个结果不是你想要的,实际上在编译的时候z=(x+y)被编译成了z=x+y*b,其结果自然就是z=31

    如果你想结果就是这样,那么这就对了,如果你不想是这样,这是为了避免二义性,要将字符串中的参数用圆括号括起来。

    # define F(a)(a)*b。

    这里有同学可能注意到了,有参数的宏定义与函数在程序语句的运行上有些相似,但是需要在注意的是,有参函数的宏定义与函数是两个完全不同的概念。

    下面我们在来看看文件包含

    文件包含就是指一个源文件可以将另一个源文件的全部内容包扩进来。

    #include

    #include”包含文件名”

    注意:

    1. include是命令关键字,表示文件包含,一个include命令只能包含一个文件。

    2. <>表示被包含文件在标准目录(include)中。

    3. “”表示被包含文件在指定的目录当中,若只有文件不带路径,则在当前目录中,若找不到,再到标准目录中寻找。

    4. 包含文件名可以是.c源文件和.h头文件,如

    #include

    #include”myhead.h”

    #include”D:\\myexam\\myfile.c”

    采用文件包含可以将多个源文件拼接在一起。

    好了!今天的讲述就到这里了。返回搜狐,查看更多

    责任编辑:

    展开全文
  • 第九章 预处理命令例如包含命令 #include宏定义命令 #define这些命令都放在函数之外,而且一般都放在源文件的前面,他们称为预处理部分。所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。...
  • C语言预处理

    2016-09-30 21:59:27
    C语言中编译预处理三种形式的命令:宏定义,文件包含,条件编译命令。 1、宏定义主要是:#define,#undef 如下: #define PI 3.1415926 /*不带参数的宏定义*/ #define Max(a,b) a>b?a:b /*带参数的宏定义*/ ...
  • C语言预处理命令

    千次阅读 2018-04-16 21:19:27
    预处理命令主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行“预处理”。比如头文件。有以下类:宏定义,文件...
  • C语言提供的三种预处理命令

    千次阅读 2015-05-09 16:19:49
    C语言三种预处理包括:宏定义(#define)、文件包含(#include)、条件编译(#if、#else、#endif)。 1,不带参数的宏定义: #define 标示符 字符串 在预编译时将宏名(标示符)替换成后面的字符串。作用:...
  • 预处理命令 主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行“预处理”。比如头文件。 有以下类:宏定义,...
  • C语言第十一回合:预处理命令的集中营   【学习目标】 ...其功能主要有三种:宏定义、文件包括、文件编译。   ANSI标准定义的C语言预处理指令预览表 A: 宏定义 (a)不带參数的宏...
  • 本章的主要内容:三种预处理命令 宏定义 文件包含 条件编译
  • C提供的预处理功能主要有以下三种:  1.宏定义  2.文件包含  3.条件编译  这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“#”开头。例如:...
  • 其功能主要有三种:宏定义、文件包含、文件编译。 A: 宏定义 (a) 不带参数的宏定义 格式:#define标识符字符串 如:#define PI 3.1415926 *标识符被称为:宏名 *在预编译时将宏名替换成字符串的过程为:...
  • c语言答案习 题 一一、选择题1.C程序的基本单位是( A)。A.B.C.D. C 。A.必须在最开始???????? B. 必须在系统调用的库函数后面????????C. 可以任意?????????? D. 必须在最后3.C程序中的变量(B )。A.B.C.D....
  • #pragma预处理命令

    2017-03-12 10:25:36
    C语言三种预处理功能 宏定义(#define)宏定义又称为宏代换、宏替换,简称“宏”。不带参数 格式:define 标识符 字符串其中标识符就是所谓的符号常量,也称为“宏名”。例: #define Pi 3.1415926//把程序中出现的...
  • C-预处理命令

    千次阅读 2010-03-12 13:00:00
    C语言提供了预处理命令主要有以下三种:1. 宏替换2. 文件包含3. 条件编译不带参数的宏不带参数的宏指定标识符来代替一个字符串,其一般格式为:#define 标识符 字符串使用宏可以增加程序的可读性,另一个好处是...
  • 预处理命令-条件编译

    2010-10-10 19:47:00
    C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。#ifndef x//先测试x是否被宏定义过#define x//如果没有宏定义下面就宏定义x并编译下面的语句...#endif//...
  • 预处理编译和连接是形成可执行程序的个 重要过程这个过程的每一步都可将一形 式的程序代码改变成另一形式的程序代码 1预处理程序负责处理组成程序的预处理命 令从而将带有预处理命令的程序文件转 ...
  • 第9章编译预处理命令 预处理命令:预处理命令不是C的组成部分为了 扩充C的功能C提供了预处理功能预处理命令不 能直接编译要先编译再和其源程序一起编译 执行过程 第9章编译预处理命令 C提供的预处理功能有一下三种 1...
  • C提供的预处理功能主要有宏定义、文件包含、条件编译三种,为了与一般C语言语句相区别,这些命令以"#"开头。 (一)宏定义 1、一般形式为:#define 标识符 字符串 带参数形式为:#define 宏名(参数表) 字符串 2...
  • 第11章 预处理命令 11.1 宏定义 11.2 文件包含处理 11.3 条件编译 ANSI C标准规定可以在C源程序中加入一些预处理命令(preprocessor Directives) 以改进程序设计环境提高编程效率 经过预处理后程序不再包括预处理命令...
  • 所谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。 C提供的预处理功能主要有三种 1. 宏定义与符号常量 2. 文件...
  • 1、 宏定义预处理命令可以改变程序设计环境,提高编程效率,它们并不是 C 语言本身的组成部分,不能直接对 它们进行编译,...C 语言提供的预处理功能有三种,分别为宏定义、文件包含和条件编译,下面将对它们进行简 单介绍。
  • 编辑预处理种类如下三种:if ~#endif 条件命令可以在函数内 // 条件选择编译功能宏定义与宏代换宏定义作用域文件包含处理 ...编辑预处理命令定义均已编译预处理标识符“#”起始,且命令的末尾不加分号“;...
  • C语言与C++中中编译预处理的学习记录: ...首先三种形式的命令:宏定义,文件包含,条件编译命令。 1、宏定义主要是:#define,#undef 如下: #define PI 3.1415926 /*不带参数的宏定义*/ #defin
  • 预处理

    2013-03-10 22:57:06
    “编译预处理”是C语言编译系统的一个组成部分。编译预处理是在编译前由编译系统中的预处理程序对源程序的预处理命令进行...三种预处理命令 执行宏定义(宏替换) 简单宏定义 定义形式:
  • 预处理命令还有其它几,这里的include 称为文件包含命令,其意义是把尖括号或引号""内指定的文件包含到本程序来,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h。因此也称为头文件或首部文件...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 214
精华内容 85
关键字:

c语言预处理命令三种

c语言 订阅