精华内容
下载资源
问答
  • 第九章编译预处理C语言提供了一些#开头的指令,如#第九章 编译预处理 C语言提供了一些#开头的指令,如: #define #include 等。 这些指令是在编译以前就事先进行处理的,因而称为“编译预处理”指令。 可以用编译...

    第九章编译预处理C语言提供了一些以#开头的指令,如#

    第九章 编译预处理 C语言提供了一些以#开头的指令,如: #define #include 等。 这些指令是在编译以前就事先进行处理的,因而称为“编译预处理”指令。 可以用编译预处理指令实现以下三种功能: 1) 宏定义 2) 文件包含 3) 条件编译 9.1 宏定义 1、不带参的宏定义 用一个指定的标识符(宏名)代表一个字符串。 一般形式: #define 标识符 字符串 如:#define PI 3.1425926 有了这一宏定义后,程序中凡是用到3.1425926的地方都可以以宏名PI出现。 例:定义一个宏名来代表一个参数。 #define PI 3.1425926 main() { float r=2,c,s; c=2*PI*r; s=PI*r*r; ┈} 系统在对程序进行编译以前,首先将所有的编译预处理指令进行预处理,对本例来说,就是将程序中所有的宏名PI还原成3.1425926, ——宏展开。 例:定义一个宏名来代表一个数据个数。 #define N 100 main() { int a[N],i; float s=0; for(i=0;i #include “file2.c” 例: #include “math.h” main() { float a,b,c,s,area; scanf(“%f%f%f”,&a,&,&c); s=0.5*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“\n %f”,area); } #include “f.h” main() { printf(“\n%f”,f1(3.0)); printf(“\n %f”,fac(10)); } float f1(float r) { return(PI*r*r); } float fac(int n) { int i; float s=1; for(i=1;i<=n;i++) s*=i; return(s); } * A file1.c A B B file1.c file2.c #define PI 3.1415926 float f1(float r); float fac(int n); f.c f.h *

    展开全文
  • 第9章 PHP访问与操作MySQL数据库9.3 使用预处理语句本节内容使用预处理语句当一条除参数以外其他部分完全相同的SQL语句需要多次执行时该如何处理呢针对这种重复执行同一条SQL语句但每次迭代使用不同参数的情况PDO...
  • C语言 预处理指令学习 电脑资料 预处理指令 分3种 >宏定义 >条件编译 >文件包含 预处理指令是在代码翻译成0跟1之前执行的 > 所有的预处理指令都是#号开头的 源文件-->预处理-->汇编-->二进制-->链接(可执行文件)--...
  • C语言预处理指令整理

    2016-11-10 16:00:24
    C源码在进行编译前会先经过预处理预处理指令均#开头,结尾没有分号(;)不是C语句。预处理器采用“语言符号”的分析方式,将空格作为区分标志之间的符号,一行作为一条指令,“\”可以将预处理

    什么是预处理指令?

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。C源码在进行编译前会先经过预处理,预处理指令均以#开头,结尾没有分号(;)不是C语句。预处理器采用“语言符号”的分析方式,将空格作为区分标志之间的符号,一行作为一条指令,“\”可以将预处理指令延伸到下一行。

    常见预处理指令

    #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。
    

    一、宏定义

    1.不带参数的宏定义

      (1)不带参数的宏定义就是用一个标识符(宏名)来代表一个字符串。它的一般形式为 #define Macro Str 在预处理的时候程序中的宏名Macro被替换为字符串Str,这个过程称为宏展开。
      (2)#define指令出现在程序中函数的外面,宏名的有效范围为该指令行起到本源文件结束或#undef。
      (3)宏展开只是简单的字符串替换,简单宏常用于定义常量,宏没有类型,也没有优先级的概念,使用定义常量主要用于指定数组长度 #define ayyLength 256 ,建议尽量使用const或enum代替宏定义常量 const intarrLen 256; 。建议不使用宏定义类型 #define Status int 而是用typedef关键字 typedef Status int; 。
      (4)宏不是C语句不能加分号,否则会将分号一起代入。考虑到优先级问题,其中表达式也可能需要括号。
      (5)宏代替的字符串可以是常量也可以表达式,格式描述符,语句(甚至是它们的一部分)等任何C程序中出现的字符串。 当然,宏代替的字符串中也可以包含已定义的宏名。#undef macro #undef指令可以终止宏名的定义。

    2.带参数的宏定义

      (1)#define Macro(argus) str
      对带参数的宏展开 是将带实参的宏 按照#define指令行中按从左到右的顺序进行置换。宏名和带参数的括号之间不能加空格,否则将成为无参数宏,空格后的每一个字符都将作为替代字符串的一部分。
      (2)带参数的宏不是函数,它只是进行简单字符代换 。定义宏时参数和字符串可以是任意的,但在定义时要注意标识符不能出现重名【#define Macro(Macro) str】(利用代码块作用域)。在实际调用时参数可能是单个数据对象也可能是表达式,由于宏只进行简单文本代换考虑到优先级和结合性的问题,建议在定义宏时将参数用圆括号括起以作为一个独立单位。
      (3)含参宏类似于inline函数,其调用也是采用传址的方式(真正的在调用点嵌入函数代码)。宏无类型,其参数也没有类型,只是一个符号代表,含参宏可以作为模板函数(C++引入,不同类型的参数可以使用同一段函数体)。
      (4)宏与函数相比没有参数传递和返回值的限制使用更加自由灵活,而函数相对独立便于完成较复杂的任务。函数调用需较多时间处理内存等,而宏不需要。

    3.宏定义中的运算符

      (1)对程序作预处理前,编译器会进行翻译处理。编译器首先把源码中的字符映射到源字符集。然后编译器查找反斜线后紧跟换行符(这里指按下回车键在源码中产生的换行符而非转义字符’\n’)的实例并删除这些实例。所以反斜线加回车键可以将宏定义扩展到多行。
      (2)#运算符与参数结合可以那参数名转换为相应字符串。例如:x是宏的形参,实参为1时#x将被替换为”1”(字符串),x将被替换为1(数值常量)。
      (3)##运算符可以把两个语言符号组合成一个语言符号。例如:n是宏的形参,实参为1时,x##n将变为标识符x1,如果无##编译器将把xn当做一个语言符号,在宏参数中中无法找到于是不进行替换。

    二、文件包含处理

    #include<filename> 或  #include"filename" 
    

    ● 尖括号中的文件名优先在编译器安装目录中查找(通常是标准库),双引号中的文件优先在工作目录中查找(自定义库)。
    ● 文件包含处理是指将另一个源文件的全部内容包含进来,即将另外的文件内容包含到本文件之中,插入到当前位置,代替预处理指令然后进行编译得到一个目标文件。
    ● 头文件中只有函数声明和宏定义,真正的实现在库中。在链接(linking)时,库才被链接进来。
    ● 这种常用在文件头部的被包含文件被称为头文件(header),常以.h作为后缀。当然不用.h作为后缀用.c作为后缀也是可以的,但是用.h更能表示此文件的性质。
    ● 同样,#include指令不一定要出现在文件首部。应当注意,被包含文件修改后,凡包含此文件的所有文件都要全部重新编译。文件包含处理是将要包含的文件的内容代替预处理指令,成为源文件的一部分。

    三、条件编译

      条件编译使得程序中的一部分内容只在满足一定条件时才进行编译或不进行编译。

    1.ifdef指令

        #ifdef Label
            Block1
        #else
            Block2
        #endif

      若指定的标识符已经被#define指令定义过,则对程序段1进行编译否则对程序段2进行编译。可以用于程序调试等。
      也可以用

     #ifdef
    
          Block
    
    #endif
    

    2.ifndef指令

    #ifndef Label
    
         Block1
    
    #else
    
        Block2
    
    #endif

      与1正好相反,若标识符未被定义则编译程序段1,否则编译程序段2。
      为了避免头文件重复包含,通常使用条件编译:

    #ifndef STDIO_H
    
    #define STDIO_H
    
         ...
    
    #endif
    

    3.if指令

    #if expr
    
         Block1
    
    #else
    
        Block2
    
    #endif

      表达式为真时编译程序段1,否则编译程序段2。
      不用条件编译指令而用if语句同样也可以实现,但是那样做目标程序长(所有语句都参加编译),运行时间长(在if语句处需进行逻辑判断)。

    展开全文
  • 其实这种#号开头的命令称为预处理命令。 C语言源文件要经过编译、链接才能生成可执行程序: 1) 编译(Compile)会将源文件(.c文件)转换为目标文件。对于 VC/VS,目标文件后缀为.obj;对于GCC,目标文件后缀...

    很多小伙伴在自己写代码的时候,已经多次使用过#include命令。使用库函数之前,应该用#include引入对应的头文件。其实这种以#号开头的命令称为预处理命令。

    C语言源文件要经过编译、链接才能生成可执行程序:

    1) 编译(Compile)会将源文件(.c文件)转换为目标文件。对于 VC/VS,目标文件后缀为.obj;对于GCC,目标文件后缀为.o。

    编译是针对单个源文件的,一次编译操作只能编译一个源文件,如果程序中有多个源文件,就需要多次编译操作。

    2) 链接(Link)是针对多个文件的,它会将编译生成的多个目标文件以及系统中的库、组件等合并成一个可执行程序。

    关于编译和链接的过程、目标文件和可执行文件的结构、.h 文件和 .c 文件的区别,我们将在后期专题中讲解。

    在实际开发中,有时候在编译之前还需要对源文件进行简单的处理。例如,我们希望自己的程序在 Windows 和 Linux 下都能够运行,那么就要在 Windows 下使用 VS 编译一遍,然后在 Linux 下使用 GCC 编译一遍。但是现在有个问题,程序中要实现的某个功能在 VS 和 GCC 下使用的函数不同(假设 VS 下使用 a(),GCC 下使用 b()),VS 下的函数在 GCC 下不能编译通过,GCC 下的函数在 VS 下也不能编译通过,怎么办呢?

    这就需要在编译之前先对源文件进行处理:如果检测到是 VS,就保留 a() 删除 b();如果检测到是 GCC,就保留 b() 删除 a()。

    这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理、提前处理)。

    预处理主要是处理以#开头的命令,例如#include <stdio.h>等。预处理命令要放在所有函数之外,而且一般都放在源文件的前面。

    预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。

    编译器会将预处理的结果保存到和源文件同名的.i文件中,例如 main.c 的预处理结果在 main.i 中。和.c一样,.i也是文本文件,可以用编辑器打开直接查看内容。

    C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理地使用它们会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。

    实例

    下面我们举个例子来说明预处理命令的实际用途。假如现在要开发一个C语言程序,让它暂停 5 秒以后再输出内容,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢?

    这个程序的难点在于,不同平台下的暂停函数和头文件都不一样:

    Windows 平台下的暂停函数的原型是void Sleep(DWORD dwMilliseconds)(注意 S 是大写的),参数的单位是“毫秒”,位于  头文件。

    Linux 平台下暂停函数的原型是unsigned int sleep (unsigned int seconds),参数的单位是“秒”,位于  头文件。

    不同的平台下必须调用不同的函数,并引入不同的头文件,否则就会导致编译错误,因为 Windows 平台下没有 sleep() 函数,也没有 <unistd.h> 头文件,反之亦然。这就要求我们在编译之前,也就是预处理阶段来解决这个问题。请看下面的代码:

    #include<stdio.h>
    
    //不同的平台下引入不同的头文件
    
    #if_WIN32//识别windows平台
    
    #include<windows.h>
    
    #elif__linux__//识别linux平台
    
    #include<unistd.h>
    
    #endif
    
    intmain(){
    
    //不同的平台下调用不同的函数
    
        #if_WIN32//识别windows平台
    
    Sleep(5000);
    
        #elif__linux__//识别linux平台
    
    sleep(5);
    
        #endif
    
    puts("http://c.biancheng.net/");
    
    return0;
    
    }

    #if、#elif、#endif 就是预处理命令,它们都是在编译之前由预处理程序来执行的。这里我们不讨论细节,只从整体上来理解。

    对于 Windows 平台,预处理以后的代码变成:

    #include<stdio.h>
    
    #include<windows.h>
    
    intmain(){
    
    Sleep(5000);
    
    puts("http://c.biancheng.net/");
    
    return0;
    
    }
    
    对于 Linux 平台,预处理以后的代码变成:
    
    #include<stdio.h>
    
    #include<unistd.h>
    
    intmain(){
    
    sleep(5);
    
    puts("http://c.biancheng.net/");
    
    return0;
    
    }

    你看,在不同的平台下,编译之前(预处理之后)的源代码都是不一样的。这就是预处理阶段的工作,它把代码当成普通文本,根据设定的条件进行一些简单的文本替换,将替换以后的结果再交给编译器处理。

    现在,你懂了吗?

    自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

    C语言C++编程学习交流圈子,【点击进入

    有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!

    微信公众号:C语言编程学习基地

    展开全文
  • 2、为了区分预处理指令和一般的C语句,所有预处理指令都符号"#"开头,并且结尾不用分号 3、预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能将预处理指令写在源程序...

    ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

    一、什么是预处理指令


    1、C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释,产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译
    2、为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号
    3、预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件
    4、C语言提供的预处理指令主要有:宏定义、文件包含、条件编译

    二、宏定义

    1> 不带参数的宏定义
    格式
    #define 宏名 字符串(如果没必要,字符串可以省略,即:#define 宏名)
    比如:

    #define PI 3.14

    作用
    在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。

    #define PI 3.14
    double value = 22 * PI * 3;

    在编译预处理时,会把PI改成3.14,变成下面的样子
    double value = 22 * 3.14 * 3;

    注意
    * 宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误
    * 在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查
    * 宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令


    #define PI 3.14
    double value = 22 * PI * 3;
    #undef PI

    * 定义一个宏时可以引用已经定义的宏名

    #define R  3.0
    #define PI 3.14
    #define L  2*PI*R
    #define S  PI*R*R

    2、带参数的宏定义
    格式
    #define 宏名(参数列表) 字符串比如:
    #define sum(a, b) (a+b)

    作用
    和不带参数的宏定义一样
    注意
    * 宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串
    * 带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数。

    #include <stdio.h>
    
    #define multi(a) 3*a
    int main()
    {
        int value = multi(4 + 5);
        printf("%d\n", value);
        return 0;
    }
    
    输出:
    17

    按照我的设想是输出60,为什么输出了17,这是为什么呢,这是因为在编译预处理时 multi(4 + 5) 会被翻译成 3 * 4 + 5,所以结果是17
    * 计算结果最好也用括号括起来

    #include <stdio.h>
    #define func(a) (a)*(a)
    
    int main()
    {
        int value = func(6)/func(3);
        printf("%d\n", value);
        return 0;
    }
    
    输出:
    36

    我们预期的输出是 4,结果却是36,原因就是 func(6)/func(3) 被翻译成 (6)*(6)/(3)*(3),所以是36
    与函数的区别
    * 宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题
    * 函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数具有更高的执行效率

    三、文件包含

    作用
    将一个文件的全部内容拷贝另一个文件中
    包含系统文件
    #include <文件名>
    包含自定义文件
    #include “文件名”
    注意
    * 允许嵌套包含,但不允许递归包含
    * 可以多次包含同一头文件,但是会减低效率

    解决:在每个含文件的开头和末尾添加下面代码


    // 文件开头
    #ifndef A_FILE
    #define A_FILE
    
    //定义的内容
    
    // 文件结尾
    #endif

    四、条件编译

    概念
    在满足一定条件的情况下才编译某些内容
    用法


    #if 条件1
    ...code1...
    #elif 条件2
    ...code2...
    #else
    ...code3...
    #endif
    
    解释:
    如果满足条件1,就只编译code1,满足条件2,就只编译code2,否则编译code3
    其他用法
    
    #if defined(A)
    // code
    #endif
    
    #if !defined(A)
    // code
    #endif
    
    
    // 和if defined(A) 用法一样
    #ifdef A
    // code
    #endif
    // 和if !defined(!) 用法一样
    #ifndef A
    // code
    #endif
    
    
    ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
    
    展开全文
  • C语言预处理

    2020-10-11 17:44:31
    在前面我们写代码时经常用到**“#”**开头的代码,“#”开头的就是预处理命令。如: #include<stdio.h> #define PI 3.1415926 在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,因为它们...
  • C语言预处理指令-include指令

    千次阅读 2015-10-23 18:12:36
    1、#include是一个预处理指令 ...A、所有的预处理指令都是#开头  B、没有分号 C、在编译之前执行 2)#include指令是一条文件包含预处理指令 作用:将指定文件的内容拷贝到写这条#include指令的地方  语法:#inc
  • ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、什么预处理指令 ...2、为了区分预处理指令和一般的C语句,所有预处理指令都符号"#"开头,并且结尾不用分号 3、预处理指令可以出
  • 在前面各章中,已多次使用过“#”号开头预处理命令。如包含命令#include,宏定义命令#define等。在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为预处理部分。 1.什么预处理 所谓...
  • C语言第十一讲,预处理命令. 一丶预处理简介 什么预处理,预处理就是预先处理....预处理主要是处理#开头的命令,例如#include <stdio.h>等。预处理命令要放在所有函数之外,而且一般都放在源文件的前面。 ...
  • 一、什么预处理指令 1> C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令)...2> 为了区分预处理指令和一般的C语句,所有预处理指令都符号"#"开头,并且结尾不
  • [Mac-10.7.1 Lion Intel-based] ...换句话说,#开头的语句即为预处理。但是,如果#被包含在引号里面,那就只是单纯的字符或者字符串了。 Q: 怎么证明预处理的存在? A: 如下代码,保存为macro.c: #inc
  • 1、什么是预处理器  2、什么是预处理器指令  3、预处理器指令  4、宏指令  5、宏函数  6、宏函数的优缺点 ...1、什么是预处理器 ... •预处理器是一个程序,用来处理源程序中的... •“#”开头的指令叫预...
  • 预处理

    2014-12-01 22:28:10
    2、为了区分预处理指令和一般的C语句,所有预处理指令都符号"#"开头,并且结尾不用分号 3、预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能将预处理指令写在源程序...
  • 编译预处理

    千次阅读 2017-06-10 19:35:38
    #开头的是C语言的编译预处理命令。C语言中编译预处理的分类 #define 宏定义 #include 文件包含 #if() 条件编译 这些编译预处理指令不是C语言的成分,不仅C语言可以使用这些预处理指令,其他语言也可以使用。运行...
  •  > 所有的预处理指令都是#号开头的    源文件-->预处理-->汇编-->二进制-->链接(可执行文件)-->运行 #define 宏名 值  定义一个没有参数的宏  宏定义干什么? 在代码翻译成0跟1之前,把所有的宏名替换...
  • 一般情况预处理指令都是#号开头的。 宏定义的格式 不带参数的宏定义: #define 宏名 值 宏定义的作用:   会在程序翻译成0和1之前, 将所有宏名替换为 宏的值   宏定义在什么时候替换  源代码 --&gt...
  • 预处理和#define

    2018-11-22 16:49:31
    前言 我们都知道一般高级语言程序编译的阶段:预处理,编译,汇编,链接。本文重点谈预处理。 目录 前言 预处理 ...预处理 ...既然要谈预处理,那么肯定得知道预处理什么?...预处理命令符号“#”开头。...
  • 预处理命令

    2016-02-25 21:13:33
    1. #开头预处理命令 预处理命令可以控制编译器在进行编译链接之前,对所写的代码进行一些其他的处理。 所谓的预处理就是在编译之前对程序的处理,所以预处理命令也叫做预编译命令。 C语言的编译器,主要完成两个...
  • 这种#开头的命令就叫做预处理命令 什么预处理 C语言源文件要经过编译、链接才能生成可执行程序。 (1)编译(Compile)会将源文件(.c)转换为目标文件。对于 VC/VS,目标文件后缀为.obj;对于GCC,目标文件后缀...
  • 预处理指令是#开头的代码行,#必须是该行除了空白字符外的第一个字符。#后是指令关键字,在#和指令关键字之间允许存在若干空白字符。 C/ C++中宏定义是什么?有什么作用呢? 使用宏进行条件编译的用法与使用宏...
  • C语言

    2019-12-08 17:05:02
    在介绍C语言的宏定义之前,需要介绍一下预处理什么预处理呢?所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的...程序中“#”开头预处理命令,如包含命令#include,宏定义命令#de...
  • include),条件编译(# ifdef)等(*开头的都是预处理命令)。 2.条件语句和条件编译有什么区别? 条件编译是C语言预处理部分的内容,它是编译器编代码时最先处理的部分,。条件编译里面有判断语句,如#if,#else,...
  • C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(# define),文件包含(# include),条件编译(# ifdef)等(*开头的都是预处理命令)。2.条件语句和条件编译有什么区别?条件编译是C语言预处理部分...
  • C语言宏详解

    千次阅读 2016-08-14 23:59:11
    在介绍C语言的宏定义之前,需要介绍一下预处理什么预处理呢?所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前...程序中“#”开头预处理命令,如包含命令#include,宏定义命令#define等。在源
  • C语言总结2

    2016-11-18 20:58:00
    #开头的代码就是预处理代码 #warning #import 2. 手写1个C程序的步骤.(面试题) 1>编写代码 2>编译 1)执行.c中的预处理代码 2)检查语法 3>链接 4>执行 3. 预处理指令的分类.(面试...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

c语言预处理以什么开头

c语言 订阅