c++ 使用##表示数组值错误的令牌连接

vhmi4jdf  于 2023-04-08  发布在  其他
关注(0)|答案(2)|浏览(99)

我只是使用“令牌与##连接”来获取每个数组。
下面是我的代码片段

宏:

#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]

有什么建议可以解决这个错误吗?为什么会失败?

rbpvctlc

rbpvctlc1#

问题在于令牌化的工作方式。gcc文档有a page about tokenization和串联,我从中收集了以下内容:
预处理器将源代码分成大致等同于C编译器标记的标记(例如文字,标识符或运算符)。这些标记可以与##运算符组合。串联的结果必须反过来是一个标记(例如,标识符形状的东西,数字,运算符),这里不是这样,这就是编译器抱怨的原因。
关键是字符序列[0] * 被分成三个符号序列 * [0]。结果x[不是令牌。
作为一个反例,以下工作:

#define MAKE_ASSIGN_OP(x) x##=
int main() { int x=1; return x MAKE_ASSIGN_OP(+) 1; }

+=以及它们的级联+=都是有效令牌。
举个例子

r1zk6ea1

r1zk6ea12#

任何建议如何解决这个错误
删除##
为什么会失败?
因为x[不是(单个)有效令牌。

相关问题