Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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 用于获取数组中的数字元素的通用宏,或在变量上使用时仅返回1?_C_Macros_Sizeof_C99 - Fatal编程技术网

C 用于获取数组中的数字元素的通用宏,或在变量上使用时仅返回1?

C 用于获取数组中的数字元素的通用宏,或在变量上使用时仅返回1?,c,macros,sizeof,c99,C,Macros,Sizeof,C99,在C语言中,获取数组元素数的宏是众所周知的,如下所示: uint32_t buffer[10]; #define ARRAY_SIZE(x) sizeof(x)/sizeof(x[0]) size_t size = ARRAY_SIZE(buffer); 问题是,在变量上使用数组元素时,是否有任何通用宏用于获取数组元素或仅返回一个数组元素?我指的是宏的以下用法: uint32_t buffer[10]; uint32_t variable; #define GET_ELEMENT

在C语言中,获取数组元素数的宏是众所周知的,如下所示:

uint32_t buffer[10];

#define ARRAY_SIZE(x)     sizeof(x)/sizeof(x[0])

size_t size = ARRAY_SIZE(buffer);
问题是,在变量上使用数组元素时,是否有任何通用宏用于获取数组元素或仅返回一个数组元素?我指的是宏的以下用法:

uint32_t buffer[10];
uint32_t variable;

#define GET_ELEMENTS(x)     ???

size_t elements_of_array = GET_ELEMENTS(buffer); // returns 10
size_t elements_of_variable = GET_ELEMENTS(variable); // returns 1
有人知道解决办法吗

我编辑了我的问题,因为它的表述错误,顺便说一句,我知道我可以使用:

sizeof(variable)/sizeof(uint32_t)
问题是如何将它组合到一个宏中,或者内联函数是更好的解决方案

您可以使用sizeof,如下所示:

#include <stdio.h>

int main(void)
{
  unsigned int buffer[10];
  // size of one unsigned int
  printf("%zu\n", sizeof(unsigned int));

  // this will print the number of elements of buffer * size of an unsigned int
  printf("%zu\n", sizeof(buffer));

  // you have a mistake
  // the following printf() gives you the number of elements
  printf("%d\n", sizeof(buffer)/sizeof(buffer[0]));
  return 0;
}
关于您所做的编辑:


因此,您无法检查传递的是数组还是变量。

是的,它被称为sizeof。请注意,当作为形式参数传递时,数组会衰减为指针。没有可移植的神奇方法来获取某个给定指针所指向的内存区域的大小。如果要使用ARRAY_size宏,它应该定义为类似于sizeofx/sizeofx[0]的内容。你说得对,我在那里犯了一个错误,我已经编辑了我的问题,这应该是一个更有意义的问题。@Lazureus:现在是一个不同的问题,它会使到目前为止所有的评论和答案无效。谢谢你的回答,不幸的是,我已经在这里编辑了我的问题,我不想再弄乱了,如果你对编辑的问题有正确的答案,请发布它,如你所愿,我将不胜感激。你现在到底想要什么?执行除法的宏?@Lazureus我的意思是,我认为它现在的样子还可以如何确定我们在宏中传递的是数组还是变量?这是一个完全不同的问题。不过,我觉得你已经理解了我目前的回答,所以我将投票支持你的问题@拉祖鲁伊斯
4
40
10