c++中的宏#define用途

这篇具有很好参考价值的文章主要介绍了c++中的宏#define用途。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

  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文章来源地址https://www.toymoban.com/news/detail-695017.html


到了这里,关于c++中的宏#define用途的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言系列-带有副作用的宏参数&#和##&命名约定&宏替换的规则

     🌈个人主页:  会编辑的果子君 💫个人格言:“成为自己未来的主人~”    目录 带有副作用的宏参数 宏替换的规则 宏函数的对比  #和## #运算符 ##运算符 命名约定 #undef 当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出

    2024年02月20日
    浏览(33)
  • Unity中的宏定义

    有时候我们需要使用区分不同平台来实现不同的逻辑,这个时候就用到宏定义了 基本语法 宏定义可以直接写在类中,也可以写在方法体中,工作方式和普通if else完全一致 以下为常用定义 UNITY_EDITOR Unity编辑器中调用 UNITY_EDITOR_WIN windows操作系统的编辑器 UNITY_ANDROID 安卓平台

    2023年04月08日
    浏览(40)
  • C语言-程序环境和预处理(2)--带副作用的宏参数,宏与函数的对比,#undef,条件编译,文件包含

    上一篇文章–《C语言-程序环境和预处理(1)》讲述了程序的翻译环境和执行环境,编译、连接,预定义符号,#define,#符号和##符号的相关知识。 链接: 《C语言-程序环境和预处理(1)》 本篇文章,讲述带副作用的宏参数,宏与函数的对比,#undef,条件编译,文件包含的相

    2024年02月08日
    浏览(59)
  • 【Unity 工程化】unity一些资源路径用途

    Resources 目录用于存放可以通过 Unity 的 Resources.Load 函数进行加载的资源。这些资源会在构建时被打包为一个单独的资源包,因此它们必须满足一些 Unity 所要求的命名和文件夹结构规则。由于这些资源被打包在一起,因此在构建后的游戏中可以更方便地使用。 应用场景示例:

    2024年02月11日
    浏览(35)
  • 关于#define的一些小知识

    目录 一,#define的声明格式: 二,#define宏的作用是为了完成替换 #define的替换规则:    三,#define使用时常犯的错误 四,宏与函数的比较 4.1,什么时候使用宏? 4.1,使用宏的好处与坏处 4.3宏的奇怪用法 #define name( parament - list ) stuff 关于#define格式需要注意的几个点: 1.在

    2023年04月09日
    浏览(91)
  • 如何去掉excel中的宏的方法

    篇一:Excel宏病毒清除方法 Excel宏病毒清除方法 用Excel宏病毒专杀工具可以清除,也可以手动清除,我觉得手动的比较好用,安全. 确认不是病毒的情况下,拷贝文件到装有office2010的计算机,试一下以下方法: 方法一、打开后另存,保存类型为:EXCEL工作簿。再次打开这个文

    2024年02月03日
    浏览(43)
  • Rust中的宏:声明宏和过程宏

    宏是Rust语言中的一个重要特性,它允许开发人员编写可重用的代码,以便在编译时扩展和生成新的代码。宏可以帮助开发人员减少重复代码,并提高代码的可读性和可维护性。Rust中有两种类型的宏:声明宏和过程宏。 声明宏是一种用于定义新的宏的语法。它使用 macro_rules

    2023年04月22日
    浏览(32)
  • Elasticsearch中fields的含义和使用场景作用用途干什么的

    一直不明白index中的字段的fields是干什么的,今天彻底搞明白. 在 Elasticsearch 中, fields 是用于定义字段的子字段(sub-field)的部分。它的作用是为同一个字段提供不同的处理和索引选项。 常见的使用场景和解决的问题包括: 排序:使用子字段定义一个字段的(keyword)类

    2024年02月09日
    浏览(38)
  • C++ 中的运算符,包括三目运算符,关系和逻辑运算符,地址运算符等等(C++复习向p8)

    加减乘除 ±*/:略 取模运算符 %: 比如 10 % 4=2 自增运算符 ++:给自己加1 自减运算符 —:给自己减1 “==” 是否相等 “!=” 是否不等 “” 是否大于 “” 是否小于 逻辑与,如果2个都是true,条件才true || 逻辑或,两个有一个是true,就是true ! 逻辑非,true变成false,false变成t

    2024年02月07日
    浏览(45)
  • 一分钟了解下JavaScript中的宏任务与微任务

    JavaScript中的宏任务(macro-task)和微任务(micro-task)是指异步任务的两种不同类型。它们的执行顺序是不同的,因此在编写异步代码时需要注意它们之间的区别。 宏任务 宏任务是指由浏览器之外的环境(如操作系统、浏览器事件等)触发的异步任务,例如: setTimeout setInte

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包