为什么在这个接口中使用`typedef void * COMPLEX`?

我有一个程序,我无法理解它是如何工作的。 这是它的一部分。 我不明白行typedef void *COMPLEX ,这个命令以及为什么使用struct COMPLEX_IMPL

 #ifndef _COMPLEX_H #define _COMPLEX_H typedef void *COMPLEX; COMPLEX NewCOMPLEX (double a, double b ); void DeleteCOMPLEX(COMPLEX this ); double GetA (COMPLEX this ); double GetB (COMPLEX this ); COMPLEX AddComplex (COMPLEX c1, COMPLEX c2, COMPLEX res); COMPLEX MultComplex (COMPLEX c1, COMPLEX c2, COMPLEX res); #endif /* _COMPLEX_H */ #ifndef _COMPLEX_H #define _COMPLEX_H typedef void *COMPLEX; COMPLEX NewCOMPLEX (double a, double b ); void DeleteCOMPLEX(COMPLEX this ); double GetA (COMPLEX this ); double GetB (COMPLEX this ); COMPLEX AddComplex (COMPLEX c1, COMPLEX c2, COMPLEX res); COMPLEX MultComplex (COMPLEX c1, COMPLEX c2, COMPLEX res); #endif /* _COMPLEX_H */ 

 #include  #include "complex.h" struct COMPLEX_IMPL { double a; double b; }; double GetA(COMPLEX this) { struct COMPLEX_IMPL *this_impl = (struct COMPLEX_IMPL*)this; return this_impl->a; } 

typedef定义类型的名称。 所以

 typedef void *COMPLEX; COMPLEX z; 

相当于

 void *z; 

指针类型通常表示指针指向的数据类型。 void *是一个例外:它是一种指针而不说它指向的值的类型是什么的方法。 您可以自由地将任何类型的指针指定给void *指针并返回。

void *指针通常用于必须使用任何类型数据的通用库函数中。 例如,考虑标准库函数memcpy

 void *memcpy(void *dest, const void *src, size_t n); 

您将该函数传递给指向任何类型src的对象的指针,指向另一个对象(通常但不总是具有相同类型)的指针,以及要复制的字节数。 该函数复制字节,它不关心字节的含义,因此它足以传递两个指向未指定类型的指针。

在这里使用void *不是好的或常见的编程习惯。 复数表示为其实部和虚部:

 struct COMPLEX_IMPL { double a; double b; }; 

典型的复数库会使其成为COMPLEX类型。

您发布的代码隐藏了COMPLEX类型的实现。 复数作为包含两个double成员的结构实现的事实仅在complex.c显而易见。 该库的用户只能看到COMPLEX是指向某个东西的指针。 这是一种数据抽象forms:隐藏数据类型的表示细节。 但是做得不好:使用这个定义,任何指向任何东西的指针都可以分配给COMPLEX 。 通常的方法是使用一个不完整的结构 ,该结构被声明并且可见一个结构,但其成员未被指定。 在complex.h ,你会写:

 struct COMPLEX_IMPL; typedef struct COMPLEX_IMPL *COMPLEX; 

这样,合法创建COMPLEX_IMPL的唯一方法是通过complex.h提供的函数,但COMPLEX类型的变量显然是指向complex.c定义的复数的表示的指针。

哦, this是一个普通的变量名。

 typedef void *COMPLEX; 

使COMPLEX成为void *类型的别名。 (这是邪恶的,顺便说一下,因为你不应该使用指针typedef和void一个有效地关闭类型检查。)

这没有“命令”,这只是一个参数的名称。

struct用于将ab成员保持在一起。 结构就是这样的。

  • typedef void* COMPLEX使’COMPLEX’成为void指针类型’void *’的别名
  • 使用COMPLEX_IMPL是因为复数有两个部分,因此将它们组合在一起
  • ‘这个’是一个变量

我认为C中的教程会对你有所帮助。

typedef void *

用于定义项目使用的dll中的函数