C++工程中常用的宏定义(#define)
2016-11-25 21:20
441 查看
尽管说define有很多不足之处,很多时候我们需要使用const来替代define, 也可以使用typedef来替代define。
但是,在一些实际工程中,我们还是不可避免的使用到了define,这给我们带来了极大的方便。
1 定义头文件,防止重复包含
其实不是真正的防止重复包含头文件,而是忽略除了第一次之外的其他包含:
http://blog.csdn.net/wangshubo1989/article/details/48310681
2 定义变量
3 分平台实现
对于一些快平台开发,完全可以使用define来包含不同的文件,或是实现不同的功能:
4 定义级别
比如打日志,我们可能有很多种日志的级别:
5 定义导入导出函数
6 单例模式
7 禁止拷贝和赋值
8 安全删除指针
9 定义命名空间
但是,在一些实际工程中,我们还是不可避免的使用到了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
相关文章推荐
- C++工程中常用的宏定义(#define)
- 常用的C/C++工程Makefile模板
- C/C++常用宏定义,注意事项,宏中#和##的用法
- c++中 宏定义(#define)的用法
- C++基础:#define宏定义和inline,const,enum的区别
- 常用的C/C++工程Makefile模板
- c++用宏定义来编写函数#define
- 常用宏定义 #define
- #(井号),##(双井号), #@在C/C++的#define宏定义中的特殊用法
- C++学习4:宏定义#define与常量const
- #(井号)在C/C++的#define宏定义中的特殊用法
- C++常用数值类型的值范围的宏定义
- C++常用数值类型的值范围的宏定义
- 几个常用的c++设计宏定义
- 常用的C/C++工程Makefile模板
- 常用的C/C++工程Makefile模板
- C++常用数值类型的值范围的宏定义
- #(井号),##(双井号), #@在C/C++的#define宏定义中的特殊用法
- 【使用CMake组织C++工程】2:CMake 常用命令和变量
- C++ 宏定义#define 中##的使用