error: expected expression before ‘struct‘
一、编译报error main.c:38:25: error: expected expression before ‘memory_node_t’ cur = container_of(n, memory_node_t, rbtree_node); ^ 和参数‘memory_node_t’有关,展开container_of宏看看。
二、展开container_of宏 #define container_of(ptr, type, member) ({ char *__mptr = (void *)(ptr); ((type *)(__mptr - offsetof(type, member))); }) 可以发现,与‘memory_node_t’有关的表达式就两个:1.(type *); 2.offsetof(type, member) 1.(type *):判断是不会有问题的 2.offsetof(type, member):问题应该出在这里
三、继续往下看offsetof的定义 找到问题原因,offsetof宏在stddef.h中定义,#include<stddef.h>即可
四、总结
1、Linux C/C++编程时常会遇到“error: expected expression before ‘struct’”错误,此错误一般是由未定义的宏(宏里套宏)或参量引起,导致编译器判断当前语句为非法语句。
2、解决编译错误,一定要从第一个error或者warning开始看起——比如上面这个问题,完整的编译log是这样的:
main.c: In function ‘memory_node_find_by_address’: main.c:17:36: warning: implicit declaration of function ‘offsetof’ [-Wimplicit-function-declaration] #define container_of(type, member) offsetof(type, member) ^ main.c:36:9: note: in expansion of macro ‘container_of’ cur = container_of(memory_node_t, rbtree_node); ^ main.c:36:22: error: expected expression before ‘memory_node_t’ cur = container_of(memory_node_t, rbtree_node); ^ main.c:17:45: note: in definition of macro ‘container_of’ #define container_of(type, member) offsetof(type, member) ^ main.c:37:9: warning: assignment makes pointer from integer without a cast [-Wint-conversion] start = cur->start; ^
第一个warning已经告诉我们了,offsetof未定义。