Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这是一个普通的Bug还是一个聪明的预编译技巧?_C_C Preprocessor - Fatal编程技术网

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看作一个操作符而不是一个函数时,一切都是有意义的