2、#include和#define

2024-09-06 18:44
文章标签 include define

本文主要是介绍2、#include和#define,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include和#define

  • 一、#include
  • 二、#define宏定义
    • 1、宏变量
    • 2、宏函数

一、#include

#include是预处理指令,会将头文件直接替换到文件中。

// hello.h
void foo() {int c = 0;int d = 1;
}
// hello.cpp
#include "hello.h"
int main() {int a = 0;int b = a;foo();return 0;
}

执行g++ -E hello.cpp -o hello.i,可以看到预处理后的文件hello.i
在这里插入图片描述
可以看到,hello.h的内容直接替换了#include "hello.h"

二、#define宏定义

#define将进行简单的文本替换。

1、宏变量

#define N 5int main() {int a = 0;int b = N * N - N;return 0;
}

执行预处理后,会直接将文件中的N替换为5。
在这里插入图片描述
这样的简单替换就存在一个问题,假如我们将上面的#define N 5改为

#define N 5+1

那么预处理后得到以下结果,并不是我们期望的。
在这里插入图片描述
所以在定义宏变量时最后将值括起来,如下。

#define N (5 + 1)

这样便能得到期望结果。
在这里插入图片描述

2、宏函数

易错点:
(1)左括号应紧贴宏函数名。

// 错误写法:在FOO后加空格在接括号
#define FOO (x) (x);
// 正确写法:FOO后紧接左括号
#define FOO(x) (x);

会提示错误
在这里插入图片描述

(2)整个宏表达式应该用括号括起来。

// 错误写法:宏表达式未加括号
#define FOO(x) (x)+1;
// 正确写法
#define FOO(x) ((x)+1);

假如我们调用

int a = 1;
int b = 3*FOO(a);

错误用法预处理后,
在这里插入图片描述
(3)宏函数参数必须加括号

// 错误写法:宏函数参数未加括号
#define FOO(x) (x*x);
// 正确写法
#define FOO(x) ((x)*(x));

假如我们调用

int a = 1;
int b = 2*FOO(a+1);

错误用法预处理后,
在这里插入图片描述
(4)使用宏函数时要警惕宏函数的多次副作用

#define FOO(x) ((x)*(x));

假如我们调用

int a = 1;
int b = FOO(++a); // 我们是想要先执行a+1,将a变为1,然后求2*2,结果为4,但实际打印结果却为9

但是预处理后,
在这里插入图片描述
(5)多语句宏函数do...while(0)

// 正确写法,直接加大括号的话,编译后会在大括号后加个分号,不符合语言规范,所以用do...while(0)
#include <iostream>
using namespace std;
#define FOO()                    \do {                         \cout << "hello" << endl; \cout << "world" << endl; \} while (0)int main() {int a = 0;if (0 == a) FOO(); // 应该不会执行,单条语句没加括号return 0;
}
//错误写法
#define FOO() cout << "hello" << endl; \cout << "world" << endl

错误用法预处理,不会打印hello但会打印world。
在这里插入图片描述
正确用法预处理
在这里插入图片描述

可以看到,宏函数使用需要注意很多地方,但是宏函数存在自有其优点。与传统函数相比,宏函数是直接替换文本,节约了函数传参,调用以及保存寄存器状态、导入寄存器之前状态的开销,大大提高了程序运行效率。

参考
bilibili-Jonases-c++

这篇关于2、#include和#define的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142817

相关文章

兔子-(PHP 5.3 and above) Please set 'request_order' ini value to include C,G and P (recommended: 'CGP'

由于在PHP最新的版本中增加了一个配置项目“request_order”,默认值为“GP”,这个存在一定的安全风险。这里我们建议用户将配置更改为“CGP” 可以在php的安装目录下找到php.ini配置目录,找到下面选项: request_order = "GP"  更改为 request_order = "CGP"   重启服务器后即可。 此

const与#define的优缺点

1.define由预处理程序处理,const由编译程序处理 2.#define不分内存,因为它是预编译指令,编译前进行了宏替换。const 不一定?某种说法,Const常量是占有内存的被“冻结”了的变量 3.const定义常量是有数据类型的,这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际

#include <iostream>介绍

在C++编程中,#include <iostream> 是一个非常重要的预处理指令,用于引入输入输出流库。以下是对 #include <iostream> 的详细介绍: 1. 作用 #include <iostream> 指令的主要作用是使程序能够使用标准输入输出流的功能。它包含了定义输入输出流的类和函数,允许程序进行数据的输入和输出操作。 2. 主要功能 引入 <iostream> 后,

【C++】define宏定义中的#,##,@#及\符号

一、# 名称:字符串化操作符 其作:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 使用条件:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前 举例: #define example1(instr) #instr string str=example1(abc); 将会展成:string str="abc"; 注意:对空格的处理 a、忽略传入参数名前面和后

Java 技术教程:@JsonInclude(JsonInclude.Include.NON_EMPTY) 注解详解

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰哦) 学习教程(传送门)Java 技术教程:@JsonInclude(JsonInclude.In

nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R

用proguaid 只混淆Android项目的src下的包的话,如果出现了上面的问题: nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R 1.如果你想开发Androidsdk 首先把你的项目的src下面打一个包。 2.然后用proguaid混淆。混淆的时候,有时候老是不成功,然你解决上面的

宏__cplusplus/////ifnbsp;define…

在C与C++混合编写的代码中,我们常常会在头文件里看到如下的声明:   #ifdef __cplusplus //如果定义了表示是c++编译器extern "C" {  #endif  // 在这里写标准c程序   #ifdef __cplusplus  }  #endif   __cplusplus是c++编译器内部定义的宏,如果使用的c编译器__cplusplus不会被定义,所以它用来区分

unbuntu usr/include/php5/ext/pcre/php_pcre.h:29:18: fatal error: pcre.h

使用sudo pecl install mongodb安装php的mongodb扩展,报错: usr/include/php5/ext/pcre/php_pcre.h:29:18: fatal error: pcre.h 可以这样解决: apt-get install libpcre3-dev 如果提示libpcre3-dev不存在,你需要更新本地资源库 sudo apt-get upd

#define和预处理指令的使用

今天再总结一点#define和预处理指令的使用。 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。正行语句构成了一条预处理指令,该指令酱紫啊编译器进行编译之前对源代码做某些转换,下面是一些常用的预处理指令, #    空指