C 工程中常用的巨集定義 define

2021-07-24 21:52:45 字數 3176 閱讀 4452

儘管說define有很多不足之處,很多時候我們需要使用const來替代define, 也可以使用typedef來替代define。

但是,在一些實際工程中,我們還是不可避免的使用到了define,這給我們帶來了極大的方便。

1 定義標頭檔案,防止重複包含

其實不是真正的防止重複包含標頭檔案,而是忽略除了第一次之外的其他包含:

#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

#include "sakura/win32/compact/dirent.h"

#endif

#if (my_platform == my_platform_ios) || (my_platform == my_platform_mac)

#include

#endif

#if (my_platform != my_platform_win32)

#include

#include

#include

#endif

4 定義級別

比如打日誌,我們可能有很多種日誌的級別:

void log_event(const

char*format, ... ) ;

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, ... ) ;

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, ... ) ;

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() \\\

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  } while(0)

#define my_safe_delete_array(p) do } while(0)

9 定義命名空間

#ifdef __cplusplus

#define ns_my_begin namespace my_project

#define using_ns_my using namespace my_project

#else

#define ns_my_begin

#define ns_my_end

#define using_ns_my

#endif

C語言中常用巨集定義

下面是一些比較重要的巨集定義,記錄一下 assert斷言 define assert cond cond void 0 assert cond,file line void assert char cond,char filename,long lineno 獲得結構體中域的偏移量 define o...

C中常用的巨集

define 定義乙個預處理巨集 undef 取消巨集的定義 include 包含檔案命令 if 編譯預處理中的條件命令,相當於c語法中的if語句 ifdef 判斷某個巨集是否被定義,若已定義,執行隨後的語句 ifndef 與 ifdef相反,判斷某個巨集是否未被定義 elif 若 if,ifdef...

iOS開發中常用到的巨集定義

字串是否為空 define kstringisempty str str iskindofclass nsnull class str nil str length 1 yes no 陣列是否為空 define karrayisempty array array nil array iskindof...