C++工程中常用的宏定义(#define)
时间:2022-05-04
本文章向大家介绍C++工程中常用的宏定义(#define),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
尽管说define有很多不足之处,很多时候我们需要使用const来替代define, 也可以使用typedef来替代define。
但是,在一些实际工程中,我们还是不可避免的使用到了define,这给我们带来了极大的方便。
1 定义头文件,防止重复包含 其实不是真正的防止重复包含头文件,而是忽略除了第一次之外的其他包含: http://blog.csdn.net/wangshubo1989/article/details/48310681
#ifndef WANGSHUBO_BASE_H_
#define WANGSHUBO_BASE_H_
...
#endif // WANGSHUBO_BASE_H_
2 定义变量
#define WANGSHUBO_SELF_MSG WM_USER + 29
static const std::string kDate = "2016-11-25";
3 分平台实现 对于一些快平台开发,完全可以使用define来包含不同的文件,或是实现不同的功能:
#if (MY_PLATFORM == MY_PLATFORM_WIN32)
#include <regex>
#include "sakura/win32/compact/dirent.h"
#endif
#if (MY_PLATFORM == MY_PLATFORM_IOS) || (MY_PLATFORM == MY_PLATFORM_MAC)
#include <ftw.h>
#endif
#if (MY_PLATFORM != MY_PLATFORM_WIN32)
#include <sys/types.h>
#include <errno.h>
#include <dirent.h>
#endif
4 定义级别 比如打日志,我们可能有很多种日志的级别:
void log_event(const char*format, ... ) {
#if MY_LOG_LEVEL == MY_LOG_LEVEL_ALL
va_list args;
va_start(args, format);
char buf[MAX_LOG_LENGTH];
vsnprintf(buf, MAX_LOG_LENGTH - 3, format, args);
strcat(buf, "n");
WCHAR wszBuf[MAX_LOG_LENGTH] = { 0 };
MultiByteToWideChar(CP_UTF8, 0, buf, -1, wszBuf, sizeof(wszBuf));
OutputDebugStringW(wszBuf);
WideCharToMultiByte(CP_ACP, 0, wszBuf, -1, buf, sizeof(buf), nullptr, FALSE);
printf("%s", buf);
fflush(stdout);
va_end(args);
#endif
}
void log_warning(const char*format, ... ) {
#if MY_LOG_LEVEL <= MY_LOG_LEVEL_WARNING
printf("Warning : ");
char buf[kMaxLogLen+1] = {0};
va_list ap;
va_start(ap, format);
vsnprintf(buf, kMaxLogLen, format, ap);
va_end(ap);
printf("%s", buf);
printf("n");
#endif
}
void log_error(const char*format, ... ) {
#if MY_LOG_LEVEL <= MY_LOG_LEVEL_ERROR
printf("Error : ");
char buf[kMaxLogLen+1] = {0};
va_list ap;
va_start(ap, format);
vsnprintf(buf, kMaxLogLen, format, ap);
va_end(ap);
printf("%s", buf);
printf("n");
#endif
}
5 定义导入导出函数
#define BASE_EXPORT __declspec(dllexport)
#else
#define BASE_EXPORT __declspec(dllimport)
#endif // defined(BASE_IMPLEMENTATION)
#else
#define BASE_EXPORT __attribute__((visibility("default")))
#endif // defined(WIN32)
#else
#define BASE_EXPORT
#endif // defined(COMPONENT_BUILD)
6 单例模式
#define SINGLETON_DEFINE(TypeName)
static TypeName* GetInstance()
{
static TypeName type_instance;
return &type_instance;
}
TypeName(const TypeName&) = delete;
TypeName& operator=(const TypeName&) = delete
7 禁止拷贝和赋值
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName(const TypeName&);
void operator=(const TypeName&)
8 安全删除指针
#define MY_SAFE_DELETE(p) do { if(p) { delete (p); (p) = nullptr; } } while(0)
#define MY_SAFE_DELETE_ARRAY(p) do { if(p) { delete[] (p); (p) = nullptr; } } while(0)
9 定义命名空间
#ifdef __cplusplus
#define NS_MY_BEGIN namespace my_project {
#define NS_MY_END }
#define USING_NS_MY using namespace my_project
#else
#define NS_MY_BEGIN
#define NS_MY_END
#define USING_NS_MY
#endif
- Java操作数据库Spring(2)
- 解决SSH连接linux中文显示乱码问题
- 设计模式——类图以及类与类之间的关系
- sysdba登录报错insufficient privileges的原因分析(r7笔记第64天)
- JDBC基础入门(1)
- LeetCode——Add Two Numbers
- python 中numpy基本方法总结可以类推tensorflow
- python基础知识——函数
- tensorflow之tf.placeholder 与 tf.Variable区别对比
- 11g备库搭建碰到自己给自己埋的坑(r7笔记第63天)
- JDBC基础入门(2)
- 11g备库无法开启ADG的原因分析 (r7笔记第62天)
- JDBC基础入门(3)
- Python多元线性回归-sklearn.linear_model,并对其预测结果评估
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 又被限速,我决定用 Serverless 搭建一款私人网盘
- C语言与C++常见面试题
- delete 和 delete [] 的真正区别
- C语言最大难点揭秘:编程的祸根!
- 【漏洞修复】MongoDB未授权访问漏洞复现和修复
- 在 Istio 中实现 Redis 集群的数据分片、读写分离和流量镜像
- 实现Android 滑动退出Activity的功能
- Android开发中播放声音的两种方法分析
- Android UI设计与开发之实现应用程序只启动一次引导界面
- Android编程实现两点触控功能示例
- Android RecycleView添加head配置封装的实例
- Android编程实现捕获程序异常退出时的错误log信息功能详解
- Android开发之Socket通信传输简单示例
- Android自定义对话框Dialog的简单实现
- Android编程实现Toast只显示最后一条的方法