为什么在这个接口中使用`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
用于将a
和b
成员保持在一起。 结构就是这样的。
-
typedef void* COMPLEX
使’COMPLEX’成为void指针类型’void *’的别名 - 使用COMPLEX_IMPL是因为复数有两个部分,因此将它们组合在一起
- ‘这个’是一个变量
我认为C中的教程会对你有所帮助。
typedef void *
用于定义项目使用的dll中的函数