滚动浏览http://git.suckless.org/st/plain/st.c我偶然发现了
#define LEN(a) (sizeof(a) / sizeof(a)[0])
我知道预编译器的魔法很难,而且我的C是最好的
但这让我想知道最后的parens是否有意义 - 不应该像
那样#define LEN(a) (sizeof(a) / sizeof((a)[0]))
答案 0 :(得分:2)
当操作数是左侧表达式而不是类型时,sizeof
运算符实际上不需要括号,因此不需要第二个sizeof
的括号,因为这不是'期待一种类型(因为尾随[0]
)。这个LEN
宏似乎用于获取静态定义的向量的大小。
例如:
int v[10];
LEN(v) will expand to (sizeof(v)/sizeof(v)[0])
(v)[0]
与v[0]
相同,因此第二个sizeof实际上类似sizeof v[0]
,有效使用sizeof
(不需要括号)
不需要括号的sizeof
的一个众所周知的(至少这里是Stack Overflow)示例是:
int *v;
v=malloc(10*sizeof *v);
获取动态定义的10元素向量。请注意,之前的LEN
宏在此处不起作用。