使用##令牌拼接计算数组尺寸时编译错误的解决咨询
令牌拼接获取数组尺寸的错误分析与解决方法
错误原因
预处理器的##令牌拼接操作要求拼接的两端必须是合法的预处理令牌,且拼接后要形成一个有效的新令牌。你写的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
相关产品推荐
相关产品推荐

