前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++工程中常用的宏定义(#define)

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

作者头像
用户7886150
修改2021-02-14 15:05:41
1.8K0
修改2021-02-14 15:05:41
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: C++ vsnprintf()

尽管说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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档