首页 > 编程语言 >C++预处理器

C++预处理器

时间:2024-07-19 10:29:02浏览次数:14  
标签:cout C++ 编译 处理器 预处理 define

C++ 预处理器

预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。
所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。
C++ 还支持很多预处理指令,比如 #include、#define、#if、#else、#line 等。

#define 预处理

无参数宏

#define 预处理指令用于创建符号常量。该符号常量通常称为宏,指令的一般形式是:
#define name replacement-text
这一行代码出现在一个文件中时,在该文件中后续出现的所有宏都将会在程序编译之前被替换为 replacement-text。例如:

#include <iostream>
using namespace std;

#define PI 3.14159
int main ()
{
    cout << "Value of PI :" << PI << endl; 
    return 0;
}

参数宏

您可以使用 #define 来定义一个带有参数的宏,如下所示:

#include <iostream>
using namespace std;
#define MIN(a,b) (a<b ? a : b)
int main ()
{
   int i, j;
   i = 100;
   j = 30;
   cout <<"较小的值为:" << MIN(i, j) << endl;
    return 0;
}
//结果输出:
//较小的值为:30

条件编译

有几个指令可以用来有选择地对部分程序源代码进行编译。这个过程被称为条件编译。

条件预处理器的结构与 if 选择结构很像。请看下面这段预处理器的代码:

#ifdef NULL
   #define NULL 0
#endif

您可以只在调试时进行编译,调试开关可以使用一个宏来实现,如下所示:

#ifdef DEBUG
   cerr <<"Variable x = " << x << endl;
#endif

如果在指令 #ifdef DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的 cerr 语句进行编译。您可以使用 #if 0 语句注释掉程序的一部分,如下所示:

#if 0
   不进行编译的代码
#endif

让我们尝试下面的实例:

#include <iostream>
using namespace std;
#define DEBUG
 
#define MIN(a,b) (((a)<(b)) ? a : b)
 
int main ()
{
   int i, j;
   i = 100;
   j = 30;
#ifdef DEBUG
   cerr <<"Trace: Inside main function" << endl;
#endif
 
#if 0
   /* 这是注释部分 */
   cout << MKSTR(HELLO C++) << endl;
#endif
 
   cout <<"The minimum is " << MIN(i, j) << endl;
 
#ifdef DEBUG
   cerr <<"Trace: Coming out of main function" << endl;
#endif
    return 0;
}
/*输出:
Trace: Inside main function
The minimum is 30
Trace: Coming out of main function
*/

### 运算符

### 预处理运算符在 C++ 和 ANSI/ISO C 中都是可用的。# 运算符会把 replacement-text 令牌转换为用引号引起来的字符串。

请看下面的宏定义:

#include <iostream>
using namespace std;
 
#define MKSTR( x ) #x
 
int main ()
{
    cout << MKSTR(HELLO C++) << endl;
 
    return 0;
}
//输出结果:
//HELLO C++

让我们来看看它是如何工作的。不难理解,C++ 预处理器把下面这行:
cout << MKSTR(HELLO C++) << endl;
转换成了:
cout << "HELLO C++" << endl;
## 运算符用于连接两个令牌。下面是一个实例:

#define CONCAT( x, y ) x ## y
当 CONCAT 出现在程序中时,它的参数会被连接起来,并用来取代宏。例如,程序中 CONCAT(HELLO, C++) 会被替换为 "HELLO C++",如下面实例所示。

#include <iostream>
using namespace std;
#define concat(a, b) a ## b
int main()
{
   int xy = 100;
   cout << concat(x, y);
   return 0;
}
//输出结果
//100

让我们来看看它是如何工作的。不难理解,C++ 预处理器把下面这行:

cout << concat(x, y);
转换成了:
cout << xy;

标签:cout,C++,编译,处理器,预处理,define
From: https://www.cnblogs.com/checha/p/18310952

相关文章

  • 开源 C++ 框架 Ocean:用于计算机视觉和增强现实
    Facebook开源了其内部用于计算机视觉(CV)和增强现实(AR) 应用程序的框架Ocean,用于执行各种任务,包括计算机视觉、几何、媒体处理、网络和渲染。Ocean主要使用C++编写,且不依赖于特定平台:Ocean是一个独立于平台的框架,支持所有主要操作系统,包括iOS、Android、Quest......
  • C++ 函数重载注意事项
    C++中的函数重载(FunctionOverloading)是一种允许同一作用域内存在多个同名函数,但是这些函数的参数列表(参数的类型、个数或顺序)必须不同。这使得函数可以根据传入参数的不同而执行不同的任务。然而,在使用函数重载时,需要注意以下几个重要事项:参数列表必须不同:函数的参数个数、......
  • 探讨C++中巧妙的边界条件处理:以花坛种花问题为例【巧妙思想、边界条件】
    在算法题中,处理数组的边界条件是一个常见的挑战。特别是在涉及多条件判断时,如何高效且清晰地处理边界问题,可以显著提升代码的简洁性和可读性。本文将以一道经典的算法题——花坛种花问题,来探讨边界条件的巧妙处理方法。问题描述605.种花问题-力扣(LeetCode)给定一个由......
  • 百度人脸识别Windows C++离线sdk C#接入
    百度人脸识别WindowsC++离线sdkC#接入目录说明设计背景•场景特点:•客户特点:•核心需求:SDK包结构效果代码说明自己根据SDK封装了动态库,然后C#调用。功能接口设计背景•场景特点:--网络:对于无网、局域网等情况,无法连接公网,API方式无法运作。如政府单......
  • C++11 包装器
    前文C++11lambda表达式-CSDN博客C++11新的类功能&&可变参数模板-CSDN博客C++11右值引用和移动语义-CSDN博客function包装器1.概念        目前我们知道的可调用对象有:函数指针(类型定义太复杂),仿函数对象(要定义一个类,用的时候有点麻烦,不适合做类型统一),lam......
  • 初识c++:类和对象(4)
    本文大纲:1.再探构造函数(1)之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。(初始化列表......
  • C++基础-引用详解(全网最详细,看这篇就够了)
    目录前言一、引用的概念二、引用的特性三、常引用四、引用的使用场景4.1引用做参数4.2引用做返回值五、传值、传引用效率比较5.1值和引用的作为返回值类型的性能比较5.2值和引用作为参数传递之间的性能差别六、引用和指针的区别结束语前言本节我们正式进入C++......
  • 【C++】内联函数
    目录前言一、内联函数的概念二、内联函数的特征三、总结:四、如何在vs2022查看反汇编以及debug模式下查看inline反汇编需要调整的配置。4.1查看反汇编4.1debug模式下查看inline反汇编需要调整的配置结尾前言各位友友好,我们又见面了!本节我们将进入C++基......
  • GESP编程能力等级认证C++编程真题解析 | 2024年3月五级
    学习C++从娃娃抓起!记录下CCF-GESP备考学习过程中的题目,记录每一个瞬间。附上汇总贴:GESP编程能力等级认证C++编程真题解析|汇总单选题第1题唯一分解定理描述的内容是()?A.任意整数都可以分解为素数的乘积B.每个合数都可以唯一分解为一系列素数的乘积C.两个不同的......
  • 白骑士的C++教学实战项目篇 4.3 多线程网络服务器
    系列目录上一篇:白骑士的C++教学实战项目篇4.2学生成绩管理系统        在这一节中,我们将实现一个多线程网络服务器项目,通过该项目,我们将学习套接字编程的基础知识以及如何使用多线程处理并发连接。此外,我们还将实现一个简单的客户端来与服务器进行通信。项目简介......