結構體中的宏定義


第一次看見在結構體中有宏定義,開始有點迷糊,想到該結構是如何存儲的?宏定義會是不會多次編譯?以下是我看的一個列子:

 struct ACL_XML {
	/* public */
	int   depth;                    /**< 最大深度 */
	int   node_cnt;                 /**< 節點總數, 包括 root 節點 */
	int   root_cnt;                 /**< 根節點個數 */
	int   attr_cnt;                 /**< 屬性總數 */
	ACL_XML_NODE *root;             /**< XML 根節點 */

	/* private */
	ACL_HTABLE *id_table;           /**< id 標識符哈希表 */
	ACL_XML_NODE *curr_node;        /**< 當前正在處理的 XML 節點 */
	ACL_DBUF_POOL *dbuf;            /**< 內存池對象 */
	ACL_DBUF_POOL *dbuf_inner;      /**< 內部分布的內存池對象 */
	size_t dbuf_keep;               /**< 內存池中保留的長度 */
	size_t space;                   /**< 在創建 xml 對象時已分配的內存大小 */

	unsigned flag;                  /**< 標志位: ACL_XML_FLAG_xxx */ 

	/**< 是否允許一個 xml 文檔中有多個根節點,內部缺省為允許 */
 #define	ACL_XML_FLAG_MULTI_ROOT	(1 << 0)

	/**< 是否兼容單節點中沒有 '/' 情況 */
 #define	ACL_XML_FLAG_IGNORE_SLASH	(1 << 1)

	/**< 是否需要對文本數據進行 xml 解碼  */
 #define	ACL_XML_FLAG_XML_DECODE		(1 << 2)

	/**< 創建 xml 對象時是否需要對數據進行 xml 編碼 */
 #define ACL_XML_FLAG_XML_ENCODE		(1 << 3)

	ACL_VSTRING *decode_buf;        /**< 當需要進行 xml 解碼時非空 */

	/* public: for acl_iterator, 通過 acl_foreach 可以列出所有子節點 */

	/* 取迭代器頭函數 */
	ACL_XML_NODE *(*iter_head)(ACL_ITER*, ACL_XML*);
	/* 取迭代器下一個函數 */
	ACL_XML_NODE *(*iter_next)(ACL_ITER*, ACL_XML*);
	/* 取迭代器尾函數 */
	ACL_XML_NODE *(*iter_tail)(ACL_ITER*, ACL_XML*);
	/* 取迭代器上一個函數 */
	ACL_XML_NODE *(*iter_prev)(ACL_ITER*, ACL_XML*);
};

在這里我們要明白的是預編譯與編譯兩者的區別:宏定義是在預編譯時就會去找到相應的常量去替換,就是在編譯成目標文件之前已經進行了替換,所以這里在結構體中有宏定義不會被重復編譯,也就不可能為結構體中的宏定義分配內存一說。

作用域

作用域還是開始於#define,結束於#undef,沒有什么只作用於結構體之內。

作用

把宏定義放在結構體中,按我看的代碼來看應該是為了更加直觀,讓人一看就知道改結構體中的個標志位是什么,被定義在哪一位 ,以便於運算。

原文鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM