c++中的宏#define用途

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/17675871.html



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

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

#define宏定义在C++中用于定义常量、函数、条件编译、字符串、条件表达式、变量、注释、调试信息、类型、函数等,下面是一些#define宏定义的用法举例:

需要注意的是,#define宏定义是一种文本替换,它不会进行类型检查和语法检查,容易出现错误。因此,在使用#define宏定义时,应该遵循一些规范,例如使用大写字母来表示常量、使用括号来保证优先级等。同时,应该避免滥用#define宏定义,以免影响代码的可读性和可维护性。


条件编译#

Copy
#define DEBUG #ifdef DEBUG // 调试代码 #endif

这里定义了一个名为DEBUG的宏,它用于控制调试代码的编译。在程序中,可以使用#ifdef#endif来判断是否定义了DEBUG宏,例如:

Copy
#ifdef DEBUG // 调试代码 #endif

这里的调试代码只有在定义了DEBUG宏的情况下才会被编译。


宏定义类型#

Copy
#define INT_PTR int*

这里定义了一个名为INT_PTR的宏,它用于定义指向整型的指针类型。在程序中,可以使用INT_PTR来代替int*,例如:

Copy
INT_PTR p = new int;

这里定义了一个名为p的指针,它指向一个整型变量。


宏定义字符串#

Copy
#define STR "Hello, world!"

这里定义了一个名为STR的字符串常量,它的值为"Hello, world!"。在程序中,可以使用STR来代替"Hello, world!",例如:

Copy
cout << STR << endl;

这里输出了"Hello, world!"。


## 宏定义变量
Copy
#define N 10 int a[N];

这里定义了一个名为N的常量,它的值为10。在程序中,可以使用N来代替10,例如:

Copy
int a[N];

这里定义了一个长度为10的整型数组a


宏定义条件表达式#

Copy
#define MAX(x, y) ((x) > (y) ? (x) : (y))

这里定义了一个名为MAX的宏,它接受两个参数xy,并返回它们中的最大值。在程序中,可以使用MAX(a, b)来代替(a) > (b) ? (a) : (b),例如:

Copy
int a = 1, b = 2; int c = MAX(a, b);

这里定义了一个整型变量c,它的值为MAX(a, b),即2。


宏定义函数#

在C++中,可以使用#define宏定义来定义一个函数,但是这种方式并不是真正的函数定义,而是一种宏替换。宏定义的函数不会被编译器检查和优化,也不会进行类型检查,因此容易出现错误。因此,不建议使用#define宏定义来定义函数。

下面是一个使用#define宏定义来定义函数的示例:

Copy
#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,例如:

Copy
int c = ADD(a, b);

这里定义了一个整型变量c,它的值为a + b,即3。

需要注意的是,使用#define宏定义来定义函数容易出现错误,例如:

Copy
int c = ADD(a++, b++);

这里使用ADD(a++, b++)来代替a++ + b++,但是由于ADD是一个宏定义,它会被替换为((a++) + (b++)),导致ab的值不是预期的值。因此,不建议使用#define宏定义来定义函数,而是应该使用真正的函数定义。


宏定义调试信息#

Copy
#define DEBUG_PRINT(x) cout << #x << " = " << x << endl

这里定义了一个名为DEBUG_PRINT的宏,它用于输出调试信息。在程序中,可以使用DEBUG_PRINT(a)来代替cout << "a" << " = " << a << endl,例如:

Copy
int a = 1; DEBUG_PRINT(a);

这里输出了"a = 1",用于调试程序。


宏定义结构体#

Copy
#define POINT struct { int x; int y; }

这里定义了一个名为POINT的宏,它用于定义一个简单的二维坐标结构体。在程序中,可以使用POINT来代替struct { int x; int y; },例如:

Copy
POINT p = { 1, 2 };

这里定义了一个名为p的结构体变量,它包含两个整型成员xy,分别为1和2。


宏定义命名空间#

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

这里定义了一个名为NS_BEGINNS_END的宏,它们用于定义命名空间。在程序中,可以使用NS_BEGIN(name)NS_END来代替namespace name {},例如:

Copy
NS_BEGIN(my_namespace) int a = 1; NS_END

这里定义了一个名为my_namespace的命名空间,它包含一个整型变量a,其值为1。


宏定义模板#

Copy
#define TEMPLATE_T template<typename T>

这里定义了一个名为TEMPLATE_T的宏,它用于定义模板。在程序中,可以使用TEMPLATE_T来代替template<typename T>,例如:

Copy
TEMPLATE_T void swap(T& a, T& b) { T temp = a; a = b; b = temp; }

这里定义了一个名为swap的模板函数,它用于交换两个变量的值。


宏定义异常类#

Copy
#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 { ... },例如:

Copy
EXCEPTION(MyException, "This is my exception.");

这里定义了一个名为MyException的异常类,它继承自std::exception,并重载了what()函数,返回一个字符串表示异常信息。


宏定义枚举#

Copy
#define ENUM(name, ...) enum name { __VA_ARGS__ }

这里定义了一个名为ENUM的宏,它用于定义枚举。在程序中,可以使用ENUM(name, ...)来代替enum name { ... },例如:

Copy
ENUM(Color, Red, Green, Blue);

这里定义了一个名为Color的枚举,它包含三个枚举值RedGreenBlue


作者:赵青青   一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
posted @   赵青青  阅读(578)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验
历史上的今天:
2014-09-05 使用Unity3D的50个技巧:Unity3D最佳实践
2013-09-05 Unity摄像机的正交视图与透视图
CONTENTS
点击右上角即可分享
微信分享提示