C++中的预处理

这篇具有很好参考价值的文章主要介绍了C++中的预处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.预定义符号

1.__FILE__进行编译的源文件

2.__LINE__文件当前的行号

3.__DATE__文件被编译的日期

4.__TIME文件被编译的时间

5.__STDC__如果编译器遵循ANSIC,其值为1,否则未定义

二.#define

基本语法:#define 名字 内容   eg.define M 1

经#define定义的常量时不经过任何计算,直接打印  eg #define M 1+1则M = 1 + 1(不是2)

注意:在用#define定义时后面不要加   ;   否则可能导致错误

#define机制规定允许把参数替换到文本中,这种实现通常称为"宏"或者"定义宏"   

eg.#define (x) (x)*(x)

宏的参数中如果有操作符,因为运算符有优先级的问题,可能导致运算顺序错误,因此在宏的书写时,最好给参数带上括号

三.带有副作用的宏

当宏参数在宏定义中出现超过一次时,如果参数带有副作用,使用宏时就可能存在危险  

eg.

#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main()
{
    int a,b;
    a = 3;
    b = 5;
    int m = MAX(a++,b++);
    
}

此时由于a++,b++具有副作用(修改了a和b本身的值),会导致输出结果m = 6,此时a = 4,b = 7

四.宏的替换规则

1.在调用宏时,首先检查参数中是否有#define定义的符号,如果有就首先替换它

2.替换文本随后被插入到程序中原本的文本的位置,即参数名被值替换

3.再次对结果文件扫描,看是否包含由#define定义的符号,如果有,重复操作

注意:1.宏参数和#define定义中可以出现其他#define的符号,但是宏不能递归

         2.当预处理器搜索#define定义的符号时,字符串常量 的内容不会被搜索

五.宏和函数的对比

宏通常用于较简单的运算

宏的程序规模和速度较好,效率更高,同时,宏对参数类型没有要求

宏的劣势:

1.每次宏的使用,一份宏的代码就会被插入到程序中,除非宏比较短,否则会大大增加程序的长度

2.宏无法调试

3.由于宏对类型不做要求,所以不够严谨

4.宏可能存在运算符优先级的问题,容易导致程序出错

宏和函数的语法相似,为了方便区分宏和函数,通常将宏的名字全部大写,函数的名字不全部大写

六.#和##

#运算符将宏的一个参数转换为字符串字面量,可以理解成字符串化,时参数不转换成对应的值

##运算符可以把它两边的符号合成一个符号,这样的连接必须产生一个合法的标识符,否则结果未定义

eg.使用宏定义求最大值的函数

#define GET_MAX(type)\
type type##_max(type x,type y)\
{\
    return (x > y ? x : y);\
}

在这段宏定义中,##会将type和_max拼接在一起得到函数名

后面就可以正常调用函数了

eg.

int m = int_max(1,2);
double n = double_max(1.5,2.3);

七.#undef

这条指令用于移除一个宏定义

八. 条件编译

在编译程序时可以使用条件编译指令经语句编译或放弃

条件编译指令:

1.

#if 常量表达式

...

#elif

...

#else

...

#endif

它的使用类似与 if 的用法

注意:条件编译指令在预处理阶段完成,所以不能用变量表示(预处理阶段变量未生成)

2.判断是否被定义

#ifdef  (或者#ifndef,表示如果没定义)

...

#endif

也可以用#if define ... (#if !define)代替

九.头文件包含

1.本地文件的包含

使用#include "..."

查找策略:先在源文件所在目录查找,如果找不到,编译器在像查找库函数头文件一样在标准位置查找头文件

2.库文件的包含

使用#include <...>

查找策略:直接在标准库中查找

3.嵌套文件包含

当工程较大时,可能存在头文件的多次包含,而头文件的多次包含会导致代码量大增,为了防止头文件的重复包含,可以使用#pragma once文章来源地址https://www.toymoban.com/news/detail-804954.html

到了这里,关于C++中的预处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】预处理

    在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。 1.翻译环境 组成一个程序的每个源文件通过编译过程分别转换成目标代码 每个目标文件由链接器(linker)捆绑在

    2024年02月17日
    浏览(67)
  • 详解C语言—预处理

    目录 一、预处理 1、预定义符号介绍 2、预处理指令 #define #define 定义标识符:  #define 定义宏: #define 替换规则 3、预处理操作符# 4、预处理操作符## 5、带副作用的宏参数 6、宏和函数对比 二、命名约定 三、预处理指令 #undef 四、命令行定义 五、条件编译  1、单分支#if:

    2024年02月08日
    浏览(55)
  • 【C语言】预处理详解

             本文目录 1 预定义符号 2 #define 2.1 #define 定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 2.7 命名约定 3 #undef 4 命令行定义 5 条件编译 6 文件包含 6.1 头文件被包含的方式 6.2 嵌套文件包含 这些预定义符号都是语言内置

    2024年02月14日
    浏览(40)
  • C语言·预处理详解

            C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的                 __FILE__  进行编译的源文件                 __LINE__  文件当前的行号                 __DATE__  文件被编译的日期                 _

    2024年01月21日
    浏览(45)
  • C语言【预处理器】

    1、一些关于预处理的知识 ​C代码中,一般带 # 的都是预处理指令,包括 宏替换、文件包含、条件编译 等。 ​为兼容一些老编译器, # 前后一般不写空格 ​预处理指令后面不加分号。 2、宏定义 3、文件包含 ​自定义头文件,用\\\" \\\" 。 引号里填相对路径或绝对路径。基于当

    2024年02月05日
    浏览(45)
  • C语言:预处理详解

    创作不易,来个三连呗! C语⾔设置了⼀些预定义符号, 可以直接使⽤ ,预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义

    2024年01月19日
    浏览(45)
  • C语言预处理详解

    上一篇博客中我们讲了C语言的编译与链接,在编译过程中有三个小阶段:预处理、编译、汇编。 本篇博客将详细讲述预处理部分的有关知识点 。 在C语言中,C语言本身设置了⼀些预定义符号,可以直接使⽤ ,预定义符号的处理也是在预处理期间进行的。 在这里介绍几个常

    2024年04月15日
    浏览(52)
  • C++系列九:预处理功能

    预处理器是 C++ 编译器提供的一个工具,允许程序员在编译之前对源代码文件做出修改。它主要是根据在代码中命名实体的定义(如宏、条件编译指令)、源文件调用等操作指令,生成一个新的源代码文件,以交给编译器进行编译。预处理器通常会将 # 开头的指令与代码区别

    2024年02月04日
    浏览(36)
  • C中的预处理,宏

    🐶博主主页: @ᰔᩚ. 一怀明月ꦿ  ❤️‍🔥 专栏系列: 线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++ 🔥 座右铭: “不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰宏

    2024年02月08日
    浏览(30)
  • 【C语言:编译、预处理详解】

    我们都知道,一个程序如果想运行起来要经过编译、链接然后才能生成.exe的文件。 编译⼜可以分解为三个过程: 预处理(有些书也叫预编译)、 编译 汇编 预处理阶段 主要处理那些源文件中以#开始的预编译指令。比如:#include,#define,处理的规则如下: 删除所有的注释

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包