You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用##令牌拼接计算数组尺寸时编译错误的解决咨询

令牌拼接获取数组尺寸的错误分析与解决方法

错误原因

预处理器的##令牌拼接操作要求拼接的两端必须是合法的预处理令牌,且拼接后要形成一个有效的新令牌。你写的Columnsize(x) x##[0]是错误用法:

  • [本身是独立的预处理令牌,x也是一个令牌,强行用##拼接二者,会让预处理器尝试生成x[这种不合法的令牌,直接触发编译错误。
  • 实际上x[0]本身就是C语言的合法语法,完全不需要用##来拼接。

你报错信息里的(x)##[0]问题本质相同,)和[都是独立令牌,无法通过##拼接成有效令牌。

解决方法

直接移除宏里的##,让x[0]以正常语法形式存在即可。修正后的代码如下:

修正后的宏定义

#define Columnsize(x) x[0]
#define get_arrsize(x) sizeof(x)/sizeof(Columnsize(x))

测试代码

uint8 test_array[4][7] = {"ok","me","hello","hi"};
// 计算结果为4,对应二维数组的第一维尺寸(行数)
get_arrsize(test_array)

这个宏的原理是:sizeof(test_array)得到整个二维数组的字节数,sizeof(test_array[0])得到第一行数组的字节数,两者相除就得到数组的行数。

内容的提问来源于stack exchange,提问作者user2986042

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:12:38