使用##连接数组值错误的令牌



我只是用## "用于获取每个数组。一些参考资料我从https://www.ibm.com/docs/ja/rdfi/9.6.0?topic=definitions-multiple-function-declarations-only

下面是我的代码片段 宏观:

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

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

问题在于标记化的工作方式。gcc文档有一个关于标记化和连接的页面,我从中收集了以下内容:

预处理器将源代码分成与C编译器标记大致相等的标记(例如字面量,标识符或操作符)。这些令牌可以与##运算符组合使用。连接的结果必须是一个令牌(例如,一个标识符形状的东西,一个数字,一个操作符),这不是这里的情况,这就是编译器报错的原因。

关键是将字符序列[0]分隔成三个符号序列[,0,]。连接操作符仅使用[作为其右侧操作符;结果x[不是一个令牌

作为一个反例,如下所示:

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

+=以及它们的连接+=都是有效的令牌。

作为一个例子

有什么建议吗

删除##

为什么失败?

因为x[不是一个(单一)有效的令牌。

相关内容

  • 没有找到相关文章

最新更新