宏的一些作用,包括但不限于这些

  1. 定义一个变量、字符串、类型
  2. 定义一个函数、条件表达式
  3. 条件编译、调试信息,异常类
  4. 定义结构体、命名空间
  5. 定义模版、枚举、函数对象

#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的宏,它接受两个参数xy,并返回它们中的最大值。在程序中,可以使用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的函数,它接受两个参数xy,并返回它们的和。在程序中,可以使用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++)),导致ab的值不是预期的值。因此,不建议使用#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的结构体变量,它包含两个整型成员xy,分别为1和2。

宏定义命名空间

#define NS_BEGIN(name) namespace name {
#define NS_END }

这里定义了一个名为NS_BEGINNS_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的枚举,它包含三个枚举值RedGreenBlue

c++中的宏#define用途的更多相关文章

  1. C/C++中慎用宏(#define)

    宏的定义在程序中是非常有用的,但是使用不当,就会给自身造成很大的困扰.通常这种困扰为:宏使用在计算方面. 本例子主要是在宏的计算方面,很多时候,大家都知道定义一个计算的宏,对于编译和编程是多么的有用. ...

  2. c++中的宏 #define _CLASSDEF(name) class name

    #include <iostream> using namespace std; #define _CLASSDEF(name) class name; \ typedef name * ...

  3. C语言中的宏定义

    目录(?)[-] 简单宏定义 带参数的宏 运算符 运算符 宏的通用属性 宏定义中圆括号 创建较长的宏 较长的宏中的逗号运算符 宏定义中的do-while循环do 空操作的定义 预定义宏 C语言中常用的 ...

  4. C中的宏

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define  标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和 ...

  5. 20个C语言中常用宏定义总结

    01: 防止一个头文件被重复包含 #ifndef COMDEF_H#define COMDEF_H//头文件内容#endif 02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数 ...

  6. Android.mk中添加宏定义

    在Boardconfig.mk 中添加一个 IS_FLAG := true 由于Boardconfig.mk和各目录的Android.mk是相互关联的 所以我们可以在Android.mk 中添加 一个 ...

  7. 头文件中的#ifndef/#define/#endif 的作用

    在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定 ...

  8. 26.怎样在Swift中定义宏?

    Swift 中没有宏定义,苹果建议使用let 或者 get 属性来替代宏定义值.虽然没有#define,但我们仍然可以使用 #if 并配合编译的配置来完成条件编译.下面会列出Swift项目开发中的一些 ...

  9. IOS中利用宏将RGB值转换为UIColor(转)

    可以在pch文件中定义宏,这样整个项目就都可以用了! #define UIColorFromRGBValue(rgbValue) [UIColor colorWithRed:((float)((rgb ...

  10. Linux中_ALIGN宏背后的原理——内存对齐

    转载自: http://englishman2008.blog.163.com/blog/static/2801290720114210254690/ 1. 原理    int a;     int ...

随机推荐

  1. 3 分钟利用 FastGPT 和 Laf 将 ChatGPT 接入企业微信

    原文链接:https://forum.laf.run/d/556 FastGPT 是一个超级的 ChatGPT 平台项目,功能非常强大: 集成了 ChatGPT.GPT4 和 Claude 可以使用任 ...

  2. web自动化01-环境搭建

    1.自动化测试是什么? 借助工具实现 借助代码编写脚本实现  2.自动化测试需要掌握那些? web自动化测试基础 移动端自动化基础 pytest自动化测试框架 po设计模式 数据驱动 日志模块使用 自 ...

  3. docker部署gitlab CI/CD (一)第一篇:部署gitlab及汉化

    网上很多类似教程,但多少有点夹带私货,有的竟然拉取的第三方镜像,而且很多都要修改配置文件,完全不知道是为什么,于是结合其他人的博客和官方文档,知其然也要知其所以然,于2023年4月17日写下这篇. 官 ...

  4. 解决element-ui下拉框数据过多,导致页面卡顿问题与本地分页功能实现

    效果 前情提要: 最近使用element-ui开发的一个页面,在打开的时候占用cpu非常高,有时候都能达到90%↑.在调试时发现其中一个下拉框的接口返回2k↑的数据.本着有问题问百度的精神,看到主要的 ...

  5. 自然语言处理 Paddle NLP - 情感分析技术及应用-理论

    自然语言处理 Paddle NLP - 信息抽取技术及应用 定义:对带有感情色彩的主观性文本进行 分析.处理.归纳和推理的过程 主观性文本分析:技术难点 背景知识 电视机的声音小(消极) 电冰箱的声音 ...

  6. 玉 - Sliver

    基操 1.启动服务端 ./sliver-server_linux 2.启用多客户端协同 new-operator --name zha0gongz1 --lhost [serverip] #生成客户端 ...

  7. Python潮流周刊#10:Twitter 的强敌 Threads 是用 Python 开发的!

    你好,我是猫哥.这里每周分享优质的 Python 及通用技术内容,大部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 首发于我的博客:https://pyth ...

  8. Vue基础技术之——数据绑定

    Vue数据大致绑定分为两类: 1.单向数据绑定(v-bind): 数据只能从data流向页面. 2.双向数据绑定(v-model):数据不仅能从data流向页面,还能从页面流向data. 话不多说,先 ...

  9. ZEGO即构自建MSDN有序网络,为实时音视频传输极致顺畅!

    由于疫情反扑,音视频云通讯的使用需求再次增加,跨机房环境经常遇到网络通信质量不佳的问题,比如延迟.卡顿.画质不清晰等.网络状况是影响用户体验最大因素之一,因此提升用户网络体验的需求被各家产品highl ...

  10. Redis的设计与实现(2)-链表

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...