C 这是一个普通的Bug还是一个聪明的预编译技巧?
我无意中翻阅了一遍C 这是一个普通的Bug还是一个聪明的预编译技巧?,c,c-preprocessor,C,C Preprocessor,我无意中翻阅了一遍 #define LEN(a) (sizeof(a) / sizeof(a)[0]) 我知道预编译魔术很难,我的C不是最好的 但这让我想知道最后的帕伦夫妇是否有道理——难道不是这样吗 #define LEN(a) (sizeof(a) / sizeof((a)[0])) 当操作数是左侧表达式而不是类型时,sizeof运算符实际上不需要括号,因此不需要第二个sizeof处的括号,因为这个括号不需要类型(因为后面有[0])。此LEN宏似乎用于获取静态定义向量的大小 例如: in
#define LEN(a) (sizeof(a) / sizeof(a)[0])
我知道预编译魔术很难,我的C不是最好的
但这让我想知道最后的帕伦夫妇是否有道理——难道不是这样吗
#define LEN(a) (sizeof(a) / sizeof((a)[0]))
当操作数是左侧表达式而不是类型时,
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
的一个众所周知的例子(至少在这里是堆栈溢出):
int *v;
v=malloc(10*sizeof *v);
获取动态定义的10元素向量。请注意,前面的
LEN
宏在这里不起作用。谢谢,我不知道有人可以使用带/o参数的sizeof,而且我从未见过这样的sizeof指针表示法。但当我把sizeof看作一个操作符而不是一个函数时,一切都是有意义的