精华内容
下载资源
问答
  • 编译预处理指令

    千次阅读 2020-02-27 12:32:06
    1.编译预处理指令 #开头的是编译预处理指令 它们不是C语言的成分,但是C语言程序离不开它们 #define用来定义一个宏 #define PI 3.14159//定义一个符号,这样定义出来的符号叫做一个宏,PI是这个宏的名字,而3,14159...

    1.编译预处理指令
    #开头的是编译预处理指令
    它们不是C语言的成分,但是C语言程序离不开它们
    #define用来定义一个宏

    #define PI 3.14159//定义一个符号,这样定义出来的符号叫做一个宏,PI是这个宏的名字,而3,14159是这个宏的值
    //C语言在编译之前先做预处理,在预处理时,把所有的PI都替换成3.14159
    int main()
    {
        printf("%f\n",2*PI*3.0);
        return 0;
    }
    

    2.#define
    #define<名字><值>
    注意没有结尾的分号,因为不是C的语句
    名字必须是一个单词,值可以是各种东西
    在C语言的而编译器开始编译之前,编译预处理程序(cpp)会把程序中的名字换成值
    完全的文本替换
    gcc->save-temps

    3.宏
    如果一个宏的值中有其他的宏的名字,也是会被替换的
    如果一个宏的值超过一行,最后一行之前的行末需要加
    宏的值后面出现的注释不会被当作宏的值的一部分

    #define PI 3.14159
    #define PI2 2*PI//PT*2
    #define PRT printf("%f ",PI);\
                printf("%f",PI2)
    int main()
    {
        printf("%f\n",PI2*3.0);//18.849540
        PRT;//3.141590 6.283180
        return 0;
    }
    

    4.没有值的宏
    #define_DEBUG
    这类宏适用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过了

    5.预定义的宏 可以让编译器替你插入一些特殊的东西
    LINE 表达这个源代码文件当前所在的行的行号
    FILE 表达这个源代码文件的文件名
    DATE 编译时候的日期
    TIME 编译时候的时间
    STDC

    int main()
    {
        printf("%s:%d\n",_FILE_,_LINE_);
        printf("%s:%s\n",_DATE_,_TIME_);
        return 0;
    }
    
    展开全文
  • 编译预处理指令 • #开头的是编译预处理指令 • 它们不是C语⾔的成分,但是C语⾔程序离不开它们  • #define⽤来定义⼀个宏 #define • #define <名字> <值>• 注意没有结尾的分号,因为不是C的...

    编译预处理指令

    • #开头的是编译预处理指令

    • 它们不是C语⾔的成分,但是C语⾔程序离不开它们  

    • #define⽤来定义⼀个宏

     

    #define

    #define <名字> <值>
    • 注意没有结尾的分号,因为不是C的语句
    名字必须是⼀个单词,值可以是各种东⻄
    • 在C语⾔的编译器开始编译之前,编译预处理程序(cpp)会把程序中的名字替换成值
    • 完全的⽂本替换
    • gcc —save-temps

     

    如果⼀个宏的值中有其他的宏的名字,也是会被
    替换的
    如果⼀个宏的值超过⼀⾏,最后⼀⾏之前的⾏末
    需要加\
    • 宏的值后⾯出现的注释不会被当作宏的值的⼀部

     

    没有值的宏

    • #define _DEBUG
    • 这类宏是⽤于条件编译的,后⾯有其他的编译预处理指令来检查这个宏是否已经被定义过了

     

    预定义的宏

    • __LINE__
    • __FILE__
    • __DATE__
    • __TIME__
    • __STDC__

    错误定义的宏


    • #define RADTODEG(x) (x * 57.29578)
    • #define RADTODEG(x) (x) * 57.29578

    带参数的宏的原则


    • ⼀切都要括号
    • 整个值要括号
    • 参数出现的每个地⽅都要括号
    • #define RADTODEG(x) ((x) * 57.29578)
    • #define cube(x) ((x)*(x)*(x))
    • 宏可以带参数

    带参数的宏


    • 可以带多个参数
    • #define MIN(a,b) ((a)>(b)?(b):(a))
    • 也可以组合(嵌套)使⽤其他宏

    // 比如++i类似的自增运算符 属于是文本替换 所以在传参的时候,并没有执行一次自增运算。它只是像函数而且带参数的宏。

    分号?


    #define PRETTY_PRINT(msg) printf(msg);   //不要加分号,因为你在C代码中会习惯再加上一个分号的。
    if (n < 10)
     PRETTY_PRINT("n is less than 10");
    else
     PRETTY_PRINT("n is at least 10");

    带参数的宏

    • 在⼤型程序的代码中使⽤⾮常普遍
    • 可以⾮常复杂,如“产⽣”函数
    • 在#和##这两个运算符的帮助下
    • 存在中⻄⽅⽂化差异
    • 部分宏会被inline函数替代

    其他编译预处理指令

    • 条件编译
    • error

     

    展开全文
  • 编译预处理指令 1.以#开头都是编译预处理指令 2.#define定义一个宏 #define 1.#define 名字 值 (注意末尾无“;”) 2.名字必须是一个单词,值可以使各种东西 3.c语言编译程序开始之前,编译预处理程序(cpp)会将...

    编译预处理指令

    1.以#开头都是编译预处理指令

    2.#define定义一个宏

    #define

    1.#define 名字 值 (注意末尾无“;”)

    2.名字必须是一个单词,值可以使各种东西

    3.c语言编译程序开始之前,编译预处理程序(cpp)会将名字换成值
    (完全的文本替换)

    1.一个宏的值中有其他宏的名字也会被替换

    2.宏的值超过一行,最后一行之前每一行的行末要加\

    3.可以注释宏

    没有值的宏

    #define __DEBUG
    用于条件编译

    预定义的宏

    ANSIC标准定义了以下6种可供C语言使用的预定义宏:
    __LINE__ 在源代码中插入当前源代码行号
    __FILE__ 在源代码中插入当前源代码文件名
    __DATE__ 在源代码中插入当前编译日期〔注意和当前系统日期区别开来〕
    __TIME__ 在源代码中插入当前编译时间〔注意和当前系统时间区别开来〕
    __STDC__ 当要求程序严格遵循ANSIC标准时该标识符被赋值为1。
    __cplusplus
    标识符__LINE____FILE__通常用来调试程序;
    标识符__DATE____TIME__通常用来在编译后的程序中加入一个时间标志,以区分程序的不同版本;
    当要求程序严格遵循ANSIC标准时,标识符__STDC__就会被赋值为1;
    当用C++编译程序编译时,标识符__cplusplus就会被定义。
    

    带参数的宏

    1.一切都要有括号,值要有括号,参数要有括号

    2.可带多个参数,也可组合嵌套其他宏

    3.宏没有类型检查,部分宏会被inline函数取代

    #define asd(x) ((x)*123)
    
    #define MIN(a,b) ((a)>(b)?(a):(b))
    
    展开全文
  • 编译预处理 C语言的编译预处理功能主要包括:文件包括(#include)、宏定义(#define)、条件编译 编译预处理是C语言编译程序的组成部分,用于解释处理C语言源程序...由于#define等编译预处理指令不是语句,不能被编...

    编译预处理

    C语言的编译预处理功能主要包括:文件包括(#include)、宏定义(#define)、条件编译

    • 编译预处理是C语言编译程序的组成部分,用于解释处理C语言源程序种的各种预处理指令,形式上都以#开头不属于C语言种真正的语句,但增强了C语言的编程功能,提高编程效率,C程序的编译处理用于把每一条C语句用若干条机器指令来实现,生成目标程序。由于#define等编译预处理指令不是语句,不能被编译程序翻译,需要在真正编译之前做一个预处理,解释完成编译预处理指令,从而把预处理指令转换成相应的C程序段,最终称为由纯粹C语句构成的程序,经编译后得到目标代码。
    • 所有编译预处理指令都在百衲衣预处理步骤中起作用,与程序真正运行过程无关。

    宏基本定义

    • #define 宏名 宏定义字符串 (宏定义要在一行之内完成)如果一行之内完成不了,可以跟一个“\”符号表示改行未结束,与下一行合起来完成完整一行
    • 上述宏定义语句以#开始,表示它在编译预处理种起作用,而不是真正的C语句,行尾无需分号
    #define PI 3.1415926
    #define TRUE true
    #define LONG_STRING "It represent a long string that \
    is used as an example."
    printf(LONG_STRING);

    带参数的宏定义

    • 宏替换在程序编译预处理时完成,对于MAX(x,y)的编译预处理,首先用变量名x和y分别替换a,b,然后再用包含x,y的条件表达式替换MAX编译结束后,程序种MAX(x,y)便消失。
    • 在进行宏定义的时候注意对参数使用括号,因为宏替换仅仅是简单的替换,如果用两个参数eg:a+b替换为x的话可能产生歧义,当main种x=SQR(x+y)进行宏替换之后的结果可能不是人们想要的,结果是:x=x+yx+y;而人们想要的结果是x=(x+y)(x+y),要避免产生这种问题就要在进行宏定义的时候将原来的:
    #define SQR(x) x*x改成#define SQR(x) (x)*(x)
    
    #include<stdio.h>
    #define MAX(a,b) a>b?a:b;
    #define SQR(x) x*x
    int main(){
        int x,y;
        scanf("%d%d",&x,&y);
        x=MAX(x,y);
        y=SQR(x);
        printf("%d %d",x,y);
        return 0;
    }

    文件包含

    • 文件包含的作用是把指定的文件模板内容插入到#include所在的位置,当程序编译连接时,系统会把所有的#include指定的文件凭借生产可执行代码,文件包含必须以#开头,这表示编译预处理命令,它将在程序编译时起作用,把指定的文件模块包含进来,当经过生成可执行代码后,include便不再存在,因此include不是真正的C语句,行尾不用分号结束
    • 文件包含的个格式:#incldue<需包含的文件名>或include "需包含的文件名"
    • 文件包含种指定的文件名如果使用尖括号<>,将使用C语言的便准头文件,由编译程序到C系统种设置好的include文件夹种把指定的文件包含进来,如果使用双引号“”,则编译程序首先到当前工作文件夹寻找被包含的文件,若找不到,再到系统include文件夹种查找文件,一般适用于编程者直接的包含文件,需要时可以在文件名前加上所在的路径。

    条件编译

    如果指向把源程序种一部分语句生成母便代码,可以使用条件编译。

    #define FLAG 1
    #if FLAG
    	程序段1
    #else
    	程序段2
    #endif	
    • 程序段1和2只有一个会被生成到目标程序种,这里FLAG被定义为1,所以会将第一个程序段编译;
    • 条件编译指令均以#开头,其意义与C语言的if-else语句完全不同,C语句if-else的两个分支程序段都会被生成到目标程序种,有程序运行时根据条件决定执行哪一段,而条件编译#if…#else…#endif不仅形式不同,而且它起作用的事可在编译与出口i的时候,一旦经过处理后,只有一段程序生成到目标程序种,另一段被舍弃。#if的条件只能起宏明,不能是程序表达式,因为在编译预处理时是无法计算表达式的,必须在程序运行时才做计算。
    展开全文
  • C/C++编译预处理指令

    千次阅读 2011-06-04 17:35:00
    众所周知,你的程序编译前要做的事就是扫描源代码,对其做初步的转换,产生新的源代码提供给编译器,这个过程就叫编译预处理。这个处理过程由预处理器来完成,预处理器是在程序真正运行前由编译器调用的预处理程序。...
  • 编译预处理

    2020-04-06 11:35:08
    宏定义指令#define #define PI 3.1415926 宏定义tip: “PI” (无引号) P I (无空格) 最好用capital letter 整数类型的极限宏 #include<stdio.h> #include<limits.h> int main() { printf(...
  • C语言编译预处理

    千次阅读 2019-08-05 08:18:43
    C语言由源代码生成可执行程序的过程如下... 其中编译预处理阶段,读取C源程序,对其中的预处理指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。 ...
  • c语言中的编译预处理命令

    千次阅读 2020-06-16 15:56:39
    1. 所有编译预处理语句以”#“开头 2. 每个预处理命令必须单独占一行 3. 语句末尾不使用分号作为结束符 4. 预处理语句主要有宏,条件编译和文件包含 1.无参宏 定义语句的格式如下: #define 标识符 字符串 作用: 用...
  • 原文地址:http://www.51cto.com/html/2005/0927/3844.htm一、预处理的由来:在C++的历史发展中,有很多的语言特征(特别是语言的晦涩之处)来自于C语言,预处理就是其中的一个。...二、常见的预处理功能:预处理
  • 【C】C语言编译预处理指令

    千次阅读 2018-05-10 09:50:06
    预处理指令并不是C语言本身的组成部分,编译器不能识别它们,不能直接对这些指令进行编译。在使用时需要以“#”开头,用以与C语言区分。 所谓预处理,就是指源程序在进行编译的第一遍扫描(词法分析和语法分析)...
  • 编译预处理指令:文件包含指令、宏定义指令、条件编译指令。“#”开头,不加分号“;” 1、文件包含指令: #include<文件名> 标准目录下搜索 #include"文件名" 当前目录下搜索,再在标准目录下搜索 2、宏...
  • 预处理指令,在编译前对源代码进行处理,预处理命令以符号#开头。 部分预编译说明 #ifdef如果宏已经定义,则编译下面代码 (与 # if defined 一致) #ifndef如果宏没有定义,则编译下面代码 #if如果给定条件...
  • C++的编译预处理

    2019-10-01 00:50:16
    C++中,在编译器对源程序进行编译...所有的预处理指令在程序中都是以“#”来引导,每一条预处理指令单独占用一行,不要用分号结束。预处理指令可以根据需要出现在程序的位置。 先来看看一些预处理指令 C++提...
  • C/C++编译预处理

    2019-02-16 16:45:42
    #include、#define这些指令都是由预处理器处理。预处理器就是一个小软件,在编译前处理C程序。 最主要功能:宏定义、条件编译 一、工作原理 1、#define 定义了一个宏——用来代表其他东西的一个名字,例如常量、...
  • 只被编译一次#pragma once结构体对齐#pragma pack(1) (结构体中数据成员按1字节对齐)加载静态链接库#pragma comment(lib, "gdiplus") (使用gdi+,调用gdiplus.lib)忽略静态链接库(用于消除静态库冲突)#...
  • 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理指令和一般的C语句,...
  • C语言预处理指令#error

    2020-11-02 11:35:42
    #endif 然后我把FreeRTOSConfig.h中的宏configMINIMAL_STACK_SIZE注释掉,然后编译,报错如下: ..\FreeRTOS\inc\FreeRTOS.h(82): error: #35: #error directive: Missing definition: configMINIMAL_STACK_SIZE ...
  • Verilog中编译预处理语句不是一般的语句,Verilog编译器会对其进行预处理,然后预处理的结果和源程序一起进行通常的编译处理。其作用范围从定义开始到文件结束。
  • 常用的编译预处理命令

    千次阅读 2018-04-19 17:43:17
    开头(位于主键盘左上角,注意这个符号不同于单引号‘)这些预处理命令的有效作用范围为定义命令之后到本文件结束或到其他命令替代该命令之处,verilog HDL提供了很多预编译命令: `accelerate, `autoexpand_...
  •  刚学着用vscode的小辣鸡, 今天尝试c++连接数据库sql server,上面有#import  就出现如标题的问题 怎么搞啊求指点 然后我搜了搜,尝试了 gcc -v -E -x c+... - 把上面提示的路径...
  • 我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。 预处理, 展开头文件/宏...
  •  ◆ 不带参数的宏定义:用来产生与一个字符串(即宏名)...◆ 处理过程:编译预处理后产生一个中间文件,文件中所有宏名(如果是带参数的宏,则宏名包括参数表在内)均用其对应的常量串或表达式串代替。替
  • C++中的编译预处理

    2018-09-25 21:04:42
    编译器接受预处理的输出,并将源代码转换成包含机器语言指令的目标文件。 预处理程序对源文件进行第1次处理,它处理的是预处理命令。C++提供的预处理命令主要有3种,分别是:文件包含命令、宏定义命令和条件编译...
  • 预处理/编译命令介绍

    千次阅读 2019-08-08 17:36:08
    预处理是在编译器编译之前进行的操作。预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。所以预处理过程先于编译器对源代码进行处理,这样做的好处是经过处理后的代码会变的很精短。 在很多...
  • C中的预处理指令有宏定义、文件包含和条件编译三种类型。 预处理指令不是c语言本身的组成部分,编译器不能够识别,不能直接对它们进行编译预处理指令用#开头以和c语句相区别。 在正式编译源代码之前,对预处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,343
精华内容 17,737
关键字:

编译预处理指令