summaryrefslogtreecommitdiff
path: root/lib/linklist.h
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2019-02-11 16:04:26 -0200
committerRenato Westphal <renato@opensourcerouting.org>2019-02-11 22:34:12 -0200
commit343cd13e17062eb024f45b44036d930988bd0299 (patch)
treeaad680435656df1cd6b2bd64ea74bbdf79b8abb0 /lib/linklist.h
parentc139972c0ffcabe73cafc3d20f257163fa81ddd0 (diff)
lib: add macro that performs explicit static casts when using a C++ compiler
C++ doesn't support implicit casts from void pointers like C does. And the libfrr headers have some bits of code that rely on implicit casts in order to work. To solve this problem, add a new "static_cast" macro that performs explicit static casts when a C++ compiler is being used, or do nothing otherwise. NOTE: since macros are only evaluated when they are used, there might be other macros from libfrr that will need to use "static_cast" as well. If a header is successfully compiled using a C++ compiler, there's no guarantee that its macros are compatible with C++. We'll only know about such macros when they are used by C++ code, then we'll need to adapt them one by one in the future. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'lib/linklist.h')
-rw-r--r--lib/linklist.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/linklist.h b/lib/linklist.h
index 5908e97a14..76fad45d08 100644
--- a/lib/linklist.h
+++ b/lib/linklist.h
@@ -295,7 +295,8 @@ extern void list_add_list(struct list *list, struct list *add);
#define ALL_LIST_ELEMENTS(list, node, nextnode, data) \
(node) = listhead(list), ((data) = NULL); \
(node) != NULL \
- && ((data) = listgetdata(node), (nextnode) = node->next, 1); \
+ && ((data) = static_cast(data, listgetdata(node)), \
+ (nextnode) = node->next, 1); \
(node) = (nextnode), ((data) = NULL)
/* read-only list iteration macro.
@@ -306,7 +307,7 @@ extern void list_add_list(struct list *list, struct list *add);
*/
#define ALL_LIST_ELEMENTS_RO(list, node, data) \
(node) = listhead(list), ((data) = NULL); \
- (node) != NULL && ((data) = listgetdata(node), 1); \
+ (node) != NULL && ((data) = static_cast(data, listgetdata(node)), 1); \
(node) = listnextnode(node), ((data) = NULL)
/* these *do not* cleanup list nodes and referenced data, as the functions