c++中的宏#define用途
宏的一些作用,包括但不限于这些
- 定义一个变量、字符串、类型
- 定义一个函数、条件表达式
- 条件编译、调试信息,异常类
- 定义结构体、命名空间
- 定义模版、枚举、函数对象
#define宏定义在C++中用于定义常量、函数、条件编译、字符串、条件表达式、变量、注释、调试信息、类型、函数等,下面是一些#define宏定义的用法举例:
需要注意的是,#define宏定义是一种文本替换,它不会进行类型检查和语法检查,容易出现错误。因此,在使用#define宏定义时,应该遵循一些规范,例如使用大写字母来表示常量、使用括号来保证优先级等。同时,应该避免滥用#define宏定义,以免影响代码的可读性和可维护性。
条件编译
#define DEBUG
#ifdef DEBUG
// 调试代码
#endif
这里定义了一个名为DEBUG的宏,它用于控制调试代码的编译。在程序中,可以使用#ifdef和#endif来判断是否定义了DEBUG宏,例如:
#ifdef DEBUG
// 调试代码
#endif
这里的调试代码只有在定义了DEBUG宏的情况下才会被编译。
宏定义类型
#define INT_PTR int*
这里定义了一个名为INT_PTR的宏,它用于定义指向整型的指针类型。在程序中,可以使用INT_PTR来代替int*,例如:
INT_PTR p = new int;
这里定义了一个名为p的指针,它指向一个整型变量。
宏定义字符串
#define STR "Hello, world!"
这里定义了一个名为STR的字符串常量,它的值为"Hello, world!"。在程序中,可以使用STR来代替"Hello, world!",例如:
cout << STR << endl;
这里输出了"Hello, world!"。
## 宏定义变量
#define N 10
int a[N];
这里定义了一个名为N的常量,它的值为10。在程序中,可以使用N来代替10,例如:
int a[N];
这里定义了一个长度为10的整型数组a。
宏定义条件表达式
#define MAX(x, y) ((x) > (y) ? (x) : (y))
这里定义了一个名为MAX的宏,它接受两个参数x和y,并返回它们中的最大值。在程序中,可以使用MAX(a, b)来代替(a) > (b) ? (a) : (b),例如:
int a = 1, b = 2;
int c = MAX(a, b);
这里定义了一个整型变量c,它的值为MAX(a, b),即2。
宏定义函数
在C++中,可以使用#define宏定义来定义一个函数,但是这种方式并不是真正的函数定义,而是一种宏替换。宏定义的函数不会被编译器检查和优化,也不会进行类型检查,因此容易出现错误。因此,不建议使用#define宏定义来定义函数。
下面是一个使用#define宏定义来定义函数的示例:
#define ADD(x, y) ((x) + (y))
int main() {
int a = 1, b = 2;
int c = ADD(a, b);
return 0;
}
这里使用#define宏定义了一个名为ADD的函数,它接受两个参数x和y,并返回它们的和。在程序中,可以使用ADD(a, b)来代替a + b,例如:
int c = ADD(a, b);
这里定义了一个整型变量c,它的值为a + b,即3。
需要注意的是,使用#define宏定义来定义函数容易出现错误,例如:
int c = ADD(a++, b++);
这里使用ADD(a++, b++)来代替a++ + b++,但是由于ADD是一个宏定义,它会被替换为((a++) + (b++)),导致a和b的值不是预期的值。因此,不建议使用#define宏定义来定义函数,而是应该使用真正的函数定义。
宏定义调试信息
#define DEBUG_PRINT(x) cout << #x << " = " << x << endl
这里定义了一个名为DEBUG_PRINT的宏,它用于输出调试信息。在程序中,可以使用DEBUG_PRINT(a)来代替cout << "a" << " = " << a << endl,例如:
int a = 1;
DEBUG_PRINT(a);
这里输出了"a = 1",用于调试程序。
宏定义结构体
#define POINT struct { int x; int y; }
这里定义了一个名为POINT的宏,它用于定义一个简单的二维坐标结构体。在程序中,可以使用POINT来代替struct { int x; int y; },例如:
POINT p = { 1, 2 };
这里定义了一个名为p的结构体变量,它包含两个整型成员x和y,分别为1和2。
宏定义命名空间
#define NS_BEGIN(name) namespace name {
#define NS_END }
这里定义了一个名为NS_BEGIN和NS_END的宏,它们用于定义命名空间。在程序中,可以使用NS_BEGIN(name)和NS_END来代替namespace name {和},例如:
NS_BEGIN(my_namespace)
int a = 1;
NS_END
这里定义了一个名为my_namespace的命名空间,它包含一个整型变量a,其值为1。
宏定义模板
#define TEMPLATE_T template<typename T>
这里定义了一个名为TEMPLATE_T的宏,它用于定义模板。在程序中,可以使用TEMPLATE_T来代替template<typename T>,例如:
TEMPLATE_T
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
这里定义了一个名为swap的模板函数,它用于交换两个变量的值。
宏定义异常类
#define EXCEPTION(name, message) class name : public std::exception { \
public: \
const char* what() const noexcept override { \
return message; \
} \
}
这里定义了一个名为EXCEPTION的宏,它用于定义异常类。在程序中,可以使用EXCEPTION(name, message)来代替class name : public std::exception { ... },例如:
EXCEPTION(MyException, "This is my exception.");
这里定义了一个名为MyException的异常类,它继承自std::exception,并重载了what()函数,返回一个字符串表示异常信息。
宏定义枚举
#define ENUM(name, ...) enum name { __VA_ARGS__ }
这里定义了一个名为ENUM的宏,它用于定义枚举。在程序中,可以使用ENUM(name, ...)来代替enum name { ... },例如:
ENUM(Color, Red, Green, Blue);
这里定义了一个名为Color的枚举,它包含三个枚举值Red、Green和Blue。
c++中的宏#define用途的更多相关文章
- C/C++中慎用宏(#define)
宏的定义在程序中是非常有用的,但是使用不当,就会给自身造成很大的困扰.通常这种困扰为:宏使用在计算方面. 本例子主要是在宏的计算方面,很多时候,大家都知道定义一个计算的宏,对于编译和编程是多么的有用. ...
- c++中的宏 #define _CLASSDEF(name) class name
#include <iostream> using namespace std; #define _CLASSDEF(name) class name; \ typedef name * ...
- C语言中的宏定义
目录(?)[-] 简单宏定义 带参数的宏 运算符 运算符 宏的通用属性 宏定义中圆括号 创建较长的宏 较长的宏中的逗号运算符 宏定义中的do-while循环do 空操作的定义 预定义宏 C语言中常用的 ...
- C中的宏
1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和 ...
- 20个C语言中常用宏定义总结
01: 防止一个头文件被重复包含 #ifndef COMDEF_H#define COMDEF_H//头文件内容#endif 02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数 ...
- Android.mk中添加宏定义
在Boardconfig.mk 中添加一个 IS_FLAG := true 由于Boardconfig.mk和各目录的Android.mk是相互关联的 所以我们可以在Android.mk 中添加 一个 ...
- 头文件中的#ifndef/#define/#endif 的作用
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定 ...
- 26.怎样在Swift中定义宏?
Swift 中没有宏定义,苹果建议使用let 或者 get 属性来替代宏定义值.虽然没有#define,但我们仍然可以使用 #if 并配合编译的配置来完成条件编译.下面会列出Swift项目开发中的一些 ...
- IOS中利用宏将RGB值转换为UIColor(转)
可以在pch文件中定义宏,这样整个项目就都可以用了! #define UIColorFromRGBValue(rgbValue) [UIColor colorWithRed:((float)((rgb ...
- Linux中_ALIGN宏背后的原理——内存对齐
转载自: http://englishman2008.blog.163.com/blog/static/2801290720114210254690/ 1. 原理 int a; int ...
随机推荐
- 中文环境下使用 huggingface 模型替换 OpenAI的Embedding 接口
OpenAI的文本嵌入衡量文本字符串的相关性.嵌入通常用于: 搜索(其中结果按与查询字符串的相关性排名) 聚类(其中文本字符串按相似性分组) 推荐(推荐具有相关文本字符串的项目) 异常检测(识别出相关 ...
- VS code 的安装
VS code 的安装 Win10环境配置(一)--C\C++篇 Win10环境配置(二) --Java篇 安装前先 ,完成环境的配置 1.工具准备 官网下载:Visual Studio Code 2 ...
- 为 Windows 系统替换优雅的苹果字体
使用 Windows 的童鞋,大家估计都用惯了默认的微软雅黑字体,字体本身也很不错,但使用久了也该换个别的字体了,换个字体换个心情嘛. 今天给大家推荐一款非常棒的一键更换 Windows 系统字体的软 ...
- 大型 3D 互动开发和优化实践
开发背景 得益于"元宇宙"概念在前段时间的爆火,各家公司都推出了使用 3D 场景的活动或频道. 3D 场景相比传统的 2D 页面优点是多一个维度,同屏展示的内容可以更多,能完整的展 ...
- 关于Unity3D第一视角下镜头穿墙的问题解决方法
昨天做室内模型的时候,遇到一个非常棘手的问题,那就是第一视角在室内运行的时候,会出现穿墙的效果.类似下图效果,在靠近墙壁的时候,出现了镜头看见了墙壁外的情况,很显然这是不符合逻辑的.我们要做的就是避免 ...
- 现代C++学习指南-类型系统
在前一篇,我们提供了一个方向性的指南,但是学什么,怎么学却没有详细展开.本篇将在前文的基础上,着重介绍下怎样学习C++的类型系统. 写在前面 在进入类型系统之前,我们应该先达成一项共识--尽可能使用C ...
- 【后端面经-Java】Java创建线程的方法简介
目录 1. 线程的基本概念 1.1 线程 1.2 线程状态和生命周期 2. 创建线程的四种方法 2.1 继承Thread类 2.2 实现Runnable接口 2.3 实现Callable接口 2.4 ...
- C++'s most vexing parse
本文地址 https://www.cnblogs.com/wanger-sjtu/p/16876846.html C++'s most vexing parse 是 Scott Meyers 在其名著 ...
- 这样看C函数才对
什么是函数?从定义来看,函数就是一段可以重复使用的代码块,比如下面这样 void hanshu() { int a = 0; int b = 3; } 这时候就应该有人要跳出来了,这是什么**!确实, ...
- Unity中的PostProcessBuild:深入解析与实用案例
Unity中的PostProcessBuild:深入解析与实用案例 在Unity游戏开发中,我们经常需要在构建完成后对生成的应用程序进行一些额外的处理.这时,我们可以使用Unity提供的PostPro ...