C 使用void**宏的数组中的泛型元素\u

C 使用void**宏的数组中的泛型元素\u,c,macros,C,Macros,我有以下C宏示例: #include <stdlib.h> #define ARRAY_AT(array , i, elem_size) \ *((void **)((((void *)array) + i * elem_size))) int main(int argc, char **argv) { long array[5] ={1,2,3,4,5}; long a = ARRAY_AT(array , 2, sizeof(long)); // a = 3

我有以下C宏示例:

#include <stdlib.h>

#define ARRAY_AT(array , i, elem_size) \
*((void **)((((void *)array) + i * elem_size)))

int main(int argc, char **argv) {
    long array[5] ={1,2,3,4,5};

    long a = ARRAY_AT(array , 2, sizeof(long)); // a = 3

    return 0;
   }
#包括
#定义数组大小(数组、i、元素大小)\
*((void**)(((void*)数组)+i*元素大小)
int main(int argc,字符**argv){
长数组[5]={1,2,3,4,5};
long a=ARRAY_AT(ARRAY,2,sizeof(long));//a=3
返回0;
}

我不太明白*(void**)部分,它是如何工作的?

哎哟。这是可怕的代码。首先,它在一个
void*
上执行指针运算,这是一个等待发生的严格的别名冲突生成编译器错误C2036:“void*”:未知大小。您是否自己编写了一些需要指导的代码?如果您有一个数组,需要从中提取第N个元素,只需取消对该数组的引用:
array[N]
。该宏比无用的宏更糟糕——它不仅不能解决任何问题,因为要使用它,您需要有数组、所需的元素和数组的类型——所有这些都是取消对数组的引用并首先获得元素所需要的。这也是错误和混乱的。我不想一个元素一个元素地把它拆开,因为你需要把它扔进比特桶,永远不要使用它。你完全可以,这只是为了教育目的,理解指针和无效指针是如何工作的。我想教育的要点是“如何不使用指针”。也就是说,学习如何不做某事是一种被低估的教育经历。