我只是用## "用于获取每个数组。一些参考资料我从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[
不是一个(单一)有效的令牌。