C++ 预处理器

news/2024/11/17 1:31:50/

预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。

所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。

我们已经看到,之前所有的实例中都有 #include 指令。这个宏用于把头文件包含到源文件中。

C++ 还支持很多预处理指令,比如 #include、#define、#if、#else、#line 等,让我们一起看看这些重要指令。

#define 预处理

#define 预处理指令用于创建符号常量。该符号常量通常称为,指令的一般形式是:

#define macro-name replacement-text 

当这一行代码出现在一个文件中时,在该文件中后续出现的所有宏都将会在程序编译之前被替换为 replacement-text。例如:

 

现在,让我们测试这段代码,看看预处理的结果。假设源代码文件已经存在,接下来使用 -E 选项进行编译,并把结果重定向到 test.p。现在,如果您查看 test.p 文件,将会看到它已经包含大量的信息,而且在文件底部的值被改为如下:

$ gcc -E test.cpp > test.p...
int main ()
{cout << "Value of PI :" << 3.14159 << endl; return 0;
}

参数宏

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

 

当上面的代码被编译和执行时,它会产生下列结果:

较小的值为:30

条件编译

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

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

#ifdef NULL#define NULL 0
#endif

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

#ifdef DEBUGcerr <<"Variable x = " << x << endl;
#endif

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

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

让我们尝试下面的实例:

 

当上面的代码被编译和执行时,它会产生下列结果:

Trace: Inside main function
The minimum is 30
Trace: Coming out of main function

# 和 ## 运算符

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

 请看下面的宏定义:

 

当上面的代码被编译和执行时,它会产生下列结果:

HELLO C++

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

cout << MKSTR(HELLO C++) << endl;

转换成了:

cout << "HELLO C++" << endl;

## 运算符用于连接两个令牌。下面是一个实例:

#define CONCAT( x, y )  x ## y

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

 

当上面的代码被编译和执行时,它会产生下列结果:

100

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

cout << concat(x, y);

转换成了:

cout << xy;

C++ 中的预定义宏

C++ 提供了下表所示的一些预定义宏:

描述
__LINE__这会在程序编译时包含当前行号。
__FILE__这会在程序编译时包含当前文件名。
__DATE__这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
__TIME__这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。

让我们看看上述这些宏的实例:

 当上面的代码被编译和执行时,它会产生下列结果:

Value of __LINE__ : 6
Value of __FILE__ : test.cpp
Value of __DATE__ : Feb 28 2011
Value of __TIME__ : 18:52:48

 补充知识:

# 和 ## 运算符

# 字符串化的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串。

当用作字符串化操作时,# 的主要作用是将宏参数不经扩展地转换成字符串常量。

  •  宏定义参数的左右两边的空格会被忽略,参数的各个 Token 之间的多个空格会被转换成一个空格。
  •  宏定义参数中含有需要特殊含义字符如"或\时,它们前面会自动被加上转义字符 \。

## 连接符号,把参数连在一起。

将多个 Token 连接成一个 Token。要点:

  •  它不能是宏定义中的第一个或最后一个 Token。
  •  前后的空格可有可无。

预处理更多例子

你可以这么写:

1.

#if SOMETHING>=100
//...
#else
//...
#endif

2.

#ifndef SOMETHING_H
#define SOMETHING_H
//...
#endif

3.

#if (defined DEBUG)&&(defined SOMETHING)
//...
#endif

4.

#ifdef SOMETHING
int func1(){/*...*/}
#else
int func1(){/*...*/}
#endif

5.

#ifdef SOMETHING
namespace space1{
#endif
//...
#ifdef SOMETHING
}//space1
#endif

......


http://www.ppmy.cn/news/675345.html

相关文章

阿里云顺利通过云原生中间件成熟度评估

前言&#xff1a; 2023 年 6 月 6 日&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;承办的“ICT中国2023 高层论坛-云原生产业发展论坛”在北京召开&#xff0c;会上正式发布了一系列云原生领域评估结果。阿里云计算有限公司&#xff08;以…

电脑出现0xC1900101错误怎么办?

在更新或安装Windows操作系统时&#xff0c;有时系统会提示出现了0xC1900101错误。这个错误的出现通常是源于与驱动程序相关的错误所致。那么当电脑出现0xC1900101错误时该怎么办呢&#xff1f; 为什么会出现错误代码0xC1900101&#xff1f; 通常情况下&#xff0c;有以下几个…

iphone11屏比例_iPhone 11屏幕和iPhone X哪个大 iPhone 11和iPhone X屏幕大小对比

目前关于下一代新iPhone X的消息已经疯传网络&#xff0c;至于该机有多么惊艳众说纷纭。近日有iPhone11跑分图流出&#xff0c;下面一起来看看iPhone 11屏幕和iPhone X哪个大。 iPhone 11 整体介绍&#xff1a; 渲染图中的概念iPhone 11整体的设计风格与iPhone X相似&#xff0…

【手写源码-设计模式6】-适配器模式-基于IPhoneX手机充电场景

1&#xff1a;主题拆解 ①基本介绍 ②IPhone手机充电场景模拟 ③类适配器与对象适配器的区别 ④适配器模式的优缺点 ⑤适用场景 ⑥C#.NET中的使用场景 2&#xff1a;基本介绍 Adapter适配器模式&#xff0c;将一个类的接口转换成客户希望的另外一个接口。使原本由于接口…

iphone电压测试软件,新款iPhone SE充电兼容性大测试之45W篇

新款iPhone SE抵达充电头网评测室后&#xff0c;我们对它的充电兼容性做了全方位测试&#xff0c;尤其是充电器、移动电源两种最常见的供电方式&#xff0c;累计参与的充电器近百款&#xff0c;图片拍摄也超过了100多张&#xff0c;堪称目前最为全面的iPhone SE充电兼容测试。测…

如何为iPhone无线充电?

如何使用Qi 认证的充电配件为 iPhone 无线充电呢&#xff1f;小编给大家带来了iPhone无线充电的详细介绍&#xff0c;需要的朋友可以看一看&#xff01; 所需条件 iPhone 8 或更新机型集成了无线充电功能&#xff0c;能够提供方便直观的充电体验。 iPhone 12 iPhone 12 mini …

cmake Targets:CMake如何构建简单的Target

CMake有三个基本命令,用于定义CMake Target,分别是: add_executable() // 构建exeadd_library() // 构建库add_custom_target() // 自定义构建目标在camke构建阶段运行的 add_…

苹果x专用计算机下,iPhoneX怎么连接电脑?苹果iPhoneX连接电脑方法

苹果iPhoneX连接电脑方法 首先需要使用数据线将iPhoneX与电脑连接(注意需要使用原装的数据线&#xff0c;自己购买的数据线可能只能用于充电) 然后在连接电脑时&#xff0c;iPhoneX手机上会询问“是否信任此电脑”&#xff0c;这时候点击“信任”即可 电脑上需要安装上iTunes&a…