这是一个普通的Bug还是一个聪明的预编译器Trick?

时间:2017-02-02 11:58:33

标签: c c-preprocessor

滚动浏览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]))

1 个答案:

答案 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宏在此处不起作用。