您的位置:首页 > 编程语言 > C语言/C++

C++工程中常用的宏定义(#define)

2016-11-25 21:20 441 查看
尽管说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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: