我只是使用“令牌与##连接”来获取每个数组。
下面是我的代码片段
宏:
#define Columnsize(x) x##[0]
#define get_arrsize(x) sizeof(x)/sizeof(Columnsize(x))
验证码:
uint8 test_array[4][7]= {"ok","me","hello","hi"};
get_arrsize(test_array)
编译后,我得到下面的错误
error: pasting ")" and "[" does not give a valid preprocessing token
| #define Columnsize(x) (x)##[0]
有什么建议可以解决这个错误吗?为什么会失败?
2条答案
按热度按时间rbpvctlc1#
问题在于令牌化的工作方式。gcc文档有a page about tokenization和串联,我从中收集了以下内容:
预处理器将源代码分成大致等同于C编译器标记的标记(例如文字,标识符或运算符)。这些标记可以与
##
运算符组合。串联的结果必须反过来是一个标记(例如,标识符形状的东西,数字,运算符),这里不是这样,这就是编译器抱怨的原因。关键是字符序列
[0]
* 被分成三个符号序列 *[
,0
,]
。结果x[
不是令牌。作为一个反例,以下工作:
+
和=
以及它们的级联+=
都是有效令牌。举个例子
r1zk6ea12#
任何建议如何解决这个错误
删除
##
为什么会失败?
因为
x[
不是(单个)有效令牌。