C++中的预定义常量和宏定义是程序中经常使用的一些固定值和宏指令,它们可以使代码更加简洁、具有可维护性,并且可以增强代码的可读性和可移植性。本文将从多个方面详细阐述C++中的预定义常量和宏定义。
一、预定义常量
C++中的预定义常量是指在程序中已经预先定义好的一些常量,以方便我们在程序中使用。常见的预定义常量有以下几种:
1. NULL
:C++中NULL值等价于零,通常用来表示一个空指针。
2. nullptr
:C++11中新增的空指针常量,推荐使用此方式来表示空指针。
3. TRUE / true
和 FALSE / false
:用来表示真和假的常量。
4. EXIT_SUCCESS
和 EXIT_FAILURE
:用于在程序正常退出或者出现错误时返回给操作系统的状态码。
代码示例:
“`c++
#include
#include
using namespace std;
int main() {
// 使用预定义常量表示空指针
int* ptr = nullptr;
if (ptr == NULL) {
cout << "ptr is null pointer" << endl;
}
// 使用EXIT_SUCCESS常量表示程序正常退出
return EXIT_SUCCESS;
}
“`
二、宏定义
宏定义是C++中一种十分实用的机制,通过宏定义我们可以将一些常用的表达式、变量、函数等封装成一些简单的指令或关键字,从而避免程序中出现大量的重复代码。宏定义的语法如下:
“`c++
#define 宏名 宏值
“`
宏名表示定义的指令或关键字,宏值则表示定义的表达式、变量或函数等。
1. 常量定义
通过宏定义我们可以定义一些常量,例如:
“`c++
#define PI 3.1415926
“`
这样我们在程序中就可以使用PI
代替3.1415926
了。
2. 函数宏
通过宏定义还可以定义一些函数宏,例如:
“`c++
#define max(a, b) ((a) > (b) ? (a) : (b))
“`
这样我们在程序中就可以调用max()
函数来求两个数中的最大值了。
但函数宏也有一些问题,例如:
“`c++
int i = 3;
cout << max(i++, 2) << endl;
“`
在这里,预期的结果应该是输出3
,但是实际上会输出4
。这是因为在宏的展开过程中i++
被展开了两次,导致i
的值不是我们期望的。
3. #
运算符
我们可以使用#
运算符将表达式转换为字符串,例如:
“`c++
#define STR(s) #s
cout << STR(hello world) << endl; // 输出 "hello world"
“`
这里将hello world
转化为字符串输出。
4. ##
运算符
我们可以使用##
运算符将两个标识符连接成一个,例如:
“`c++
#define CONNECT(a, b) a ## b
int ab = CONNECT(a, b);
“`
这里将a
和b
连接成了一个标识符ab
。
代码示例:
“`c++
#include
using namespace std;
#define PI 3.1415926
#define max(a, b) ((a) > (b) ? (a) : (b))
#define STR(s) #s
#define CONNECT(a, b) a ## b
int main() {
cout << "PI: " << PI << endl;
cout << "max of 3 and 4: " << max(3, 4) << endl;
cout << STR(hello world) << endl; // 输出 "hello world"
int CONNECT(a, b) = 10;
cout << "ab = " << ab << endl; // 输出10
}
“`
三、预定义宏
除了上述预定义常量和宏定义外,C++中还提供了一些预定义宏,可以用来表示编译的环境和状态。常见的预定义宏如下:
1. __FILE__
:表示当前源代码文件名。
2. __LINE__
:表示当前源文件中的行号。
3. __DATE__
:表示编译日期,格式为“Mmm dd yyyy”。
4. __TIME__
:表示编译时间,格式为“hh:mm:ss”。
代码示例:
“`c++
#include
using namespace std;
#define PRINT_LOCATION cout << __FILE__ << ", line " << __LINE__ << endl;
int main() {
PRINT_LOCATION;
cout << "build date: " << __DATE__ << endl;
cout << "build time: " << __TIME__ << endl;
}
“`
输出结果:
“`
example.cpp, line 7
build date: Sep 19 2021
build time: 17:28:53
“`
四、预编译头文件
预处理是编译前进行的一系列预处理操作,为了提高编译速度和避免重复编译,C++提供了预编译头文件的机制,可以将一些常用的头文件预先编译成头文件,然后在编译时直接调用,极大的提高了编译效率。
预编译头文件的文件名通常为stdafx.h
,使用该文件时需要在程序的第一行加上以下指令:
“`c++
#include “stdafx.h”
“`
这条指令会先载入预编译头文件。
代码示例:
“`c++
// stdafx.h
#ifdef _MSC_VER
#pragma once
#endif
#include
#include
#include
#include
// main.cpp
#include “stdafx.h”
using namespace std;
int main() {
srand(time(0));
int x = rand() % 10;
cout << "x = " << x << endl;
return EXIT_SUCCESS;
}
“`
在stdafx.h
中预编译了常用的头文件,在程序中直接使用即可。
总结
本文详细阐述了C++中预定义常量和宏定义的用法和特点,从预定义常量、宏定义、预定义宏、预编译头文件等多个方面进行了说明和示例代码。希望本文对大家理解和使用C++中常量和宏定义有所帮助。
原创文章,作者:IPZK,如若转载,请注明出处:https://www.506064.com/n/138857.html