儘管說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...