我正在尝试定义一个宏来在我的全局范围内生成一个结构,如上面的代码:
#define BUFFER(size) \
struct { \
unsigned short size = ##size; \
unsigned short readIndex = 0; \
unsigned short writeIndex = 0; \
unsigned char dataPtr[##size##]; \
}
BUFFER(10) buffer10bytes;
BUFFER(50) buffer50bytes;
问题是显然gcc没有评估这个宏。 存档是否可能?怎么样?
这是我的编译器错误:
In file included from ../usart.c:12:0:
../usart.c:14:8: error: expected identifier or '(' before numeric constant
BUFFER(10) buffer10bytes;
^
../buff.h:24:17: note: in definition of macro 'BUFFER'
unsigned short size = ##size; \
^
../buff.h:24:22: error: pasting "=" and "10" does not give a valid preprocessing token
unsigned short size = ##size; \
^
../usart.c:14:1: note: in expansion of macro 'BUFFER'
BUFFER(10) buffer10bytes;
^
../buff.h:25:27: error: expected ':', ',', ';', '}' or '__attribute__' before '=' token
unsigned short readIndex = 0; \
^
../usart.c:14:1: note: in expansion of macro 'BUFFER'
BUFFER(10) buffer10bytes;
^
../buff.h:27:23: error: pasting "[" and "10" does not give a valid preprocessing token
unsigned char dataPtr[##size##]; \
^
../usart.c:14:1: note: in expansion of macro 'BUFFER'
BUFFER(10) buffer10bytes;
^
../usart.c:14:8: error: pasting "10" and "]" does not give a valid preprocessing token
BUFFER(10) buffer10bytes;
^
../buff.h:27:26: note: in definition of macro 'BUFFER'
unsigned char dataPtr[##size##]; \
^
../usart.c:15:8: error: expected identifier or '(' before numeric constant
BUFFER(50) buffer50bytes;
^
../buff.h:24:17: note: in definition of macro 'BUFFER'
unsigned short size = ##size; \
^
../buff.h:24:22: error: pasting "=" and "50" does not give a valid preprocessing token
unsigned short size = ##size; \
^
../usart.c:15:1: note: in expansion of macro 'BUFFER'
BUFFER(50) buffer50bytes;
^
../buff.h:25:27: error: expected ':', ',', ';', '}' or '__attribute__' before '=' token
unsigned short readIndex = 0; \
^
../usart.c:15:1: note: in expansion of macro 'BUFFER'
BUFFER(50) buffer50bytes;
^
../buff.h:27:23: error: pasting "[" and "50" does not give a valid preprocessing token
unsigned char dataPtr[##size##]; \
^
../usart.c:15:1: note: in expansion of macro 'BUFFER'
BUFFER(50) buffer50bytes;
^
../usart.c:15:8: error: pasting "50" and "]" does not give a valid preprocessing token
BUFFER(50) buffer50bytes;
^
../buff.h:27:26: note: in definition of macro 'BUFFER'
unsigned char dataPtr[##size##]; \
^
make: ** [usart.o] Erro 1
答案 0 :(得分:8)
取出##
。这是用于从两个令牌创建新令牌;但你不是在这里做,你实际上只想要两个令牌。
此外,您不能使用与宏参数相同的变量名称。
另一个问题是你不能在结构定义中放置初始化器。因此,您必须修改宏的形式,例如:
#define DECLARE_BUFFER(size_, name) \
struct { \
unsigned short readIndex;
unsigned short writeIndex;
unsigned char dataPtr[size_]; \
} name = { 0 }
BUFFER(10, buffer10bytes);
BUFFER(50, buffer50bytes);
我已删除size
,因为它似乎是多余的:您始终可以sizeof X.dataPtr
获取该值。 (注意:Ptr
是一个糟糕的数组名称)。但如果需要(如Remy在评论中所建议的那样),如果要改变以表示缓冲区的内容或其他内容,则可以包含size
:
#define DECLARE_BUFFER(size_, name) \
struct { \
unsigned short size;
unsigned short readIndex;
unsigned short writeIndex;
unsigned char dataPtr[size_]; \
} name = { size_, 0 }