Browse Source

list: LIST_HEAD_INIT

I find hiding the declaration in LIST_HEAD() a bit weird.
Rusty Russell 15 years ago
parent
commit
9a83a074ce
2 changed files with 23 additions and 3 deletions
  1. 18 1
      ccan/list/list.h
  2. 5 2
      ccan/list/test/run.c

+ 18 - 1
ccan/list/list.h

@@ -94,6 +94,20 @@ struct list_node *list_check_node(const struct list_node *n,
 #define list_debug_node(n) (n)
 #endif
 
+/**
+ * LIST_HEAD_INIT - initalizer for an empty list_head
+ * @name: the name of the list.
+ *
+ * Explicit initializer for an empty list.
+ *
+ * See also:
+ *	LIST_HEAD, list_head_init()
+ *
+ * Example:
+ *	static struct list_head my_list = LIST_HEAD_INIT(my_list);
+ */
+#define LIST_HEAD_INIT(name) { { &name.n, &name.n } }
+
 /**
  * LIST_HEAD - define and initalize an empty list_head
  * @name: the name of the list.
@@ -101,11 +115,14 @@ struct list_node *list_check_node(const struct list_node *n,
  * The LIST_HEAD macro defines a list_head and initializes it to an empty
  * list.  It can be prepended by "static" to define a static list_head.
  *
+ * See also:
+ *	LIST_HEAD_INIT, list_head_init()
+ *
  * Example:
  *	static LIST_HEAD(my_global_list);
  */
 #define LIST_HEAD(name) \
-	struct list_head name = { { &name.n, &name.n } }
+	struct list_head name = LIST_HEAD_INIT(name)
 
 /**
  * list_head_init - initialize a list_head

+ 5 - 2
ccan/list/test/run.c

@@ -20,11 +20,14 @@ int main(int argc, char *argv[])
 	struct parent parent;
 	struct child c1, c2, c3, *c, *n;
 	unsigned int i;
+	struct list_head list = LIST_HEAD_INIT(list);
 
-	plan_tests(47);
-	/* Test LIST_HEAD, list_empty and check_list */
+	plan_tests(49);
+	/* Test LIST_HEAD, LIST_HEAD_INIT, list_empty and check_list */
 	ok1(list_empty(&static_list));
 	ok1(list_check(&static_list, NULL));
+	ok1(list_empty(&list));
+	ok1(list_check(&list, NULL));
 
 	parent.num_children = 0;
 	list_head_init(&parent.children);