2012-02-23 24 views
-1

我有一个程序,我不明白它是如何工作的。这是它的一部分。 我不明白行typedef void *COMPLEX,命令this和为什么struct COMPLEX_IMPL正在使用。为什么在此界面中使用`typedef void * COMPLEX`?

#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 <stdio.h> 
#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; 
} 
+0

由此我猜想这是C++?无论如何,请看这个应用程序正在使用的语言的基本知识,你应该能够自己回答你的问题。 – steffinchen 2012-02-23 11:41:16

+0

@steffinchen相反,由于使用'this'作为一个普通的标识符,这是一个C程序,它是无效的C++。我建议你更仔细地研究C++的基础知识。如果你不做这种嘲弄的评论,那也会更好;这里使用'void *'不是一个基本的问题。 – Gilles 2012-02-24 10:45:39

回答

2
typedef void *COMPLEX; 

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

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

struct用于将ab成员放在一起。这就是结构的用途。

+0

_makes COMPLEX类型的别名void * ._ 这是什么意思?我无法得到它...:/ – 2012-02-23 13:16:15

+0

@ΕμμανουήλΒαρέσης:你知道关于C的一切吗? – 2012-02-23 13:45:06

+0

是的,我为什么要问? – 2012-02-23 13:48:29

0
  • typedef void* COMPLEX品牌“复杂的”为空指针类型“void *的”
  • COMPLEX_IMPL是使用,因为复数有两个部分的别名,所以这组在一起
  • '这是一个可变

我觉得在C中的教程会在这里大大受益。

+0

我只是无法得到什么是无效指针...:/ – 2012-02-23 12:00:53

+0

它没有做任何事情 - 它是一个指向未知类型的指针。在执行不兼容的投射操作时,通常将它用作中间人,除此之外。在这个例子中的用法似乎不是一个好主意。 – jstephenson 2012-02-23 12:10:49

+0

好吧,但如果它没有做什么,那么为什么它存在于程序中, – 2012-02-23 13:12:36

7

typedef定义了一个类型的名称。所以

typedef void *COMPLEX; 
COMPLEX z; 

相当于

void *z; 

指针类型通常表明什么样的数据的指针指向。 void *是一个例外:它是一种指针而不指出它指向的值的类型是什么的方法。您可以自由分配任何类型的指针并返回指针void *

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

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

您的指针传递函数的任何类型的src的一个目的,一个指针到另一个对象(通常是,但不总是相同类型的) dest,和一些要复制的字节。该函数复制字节,它不关心字节的意思,所以它足以传递两个指向未指定类型的指针。

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

struct COMPLEX_IMPL { double a; double b; }; 

典型的复杂数字图书馆将使这个COMPLEX类型。

您发布的代码隐藏了COMPLEX类型的实现。复数实现为包含两个double成员的结构的事实仅在complex.c中显而易见。图书馆的用户只看到COMPLEX是指向某物的指针。这是data abstraction的一种形式:隐藏数据类型的表示细节。但它做得很差:有了这个定义,任何指向任何东西的指针都可以分配给一个COMPLEX。正常的方法是使用incomplete structure,这是一个声明和可见的结构,但其成员没有指定。在complex.h,你可以这样写:

struct COMPLEX_IMPL; 
typedef struct COMPLEX_IMPL *COMPLEX; 

这样一来,只有这样,才能合法地创造COMPLEX_IMPL是通过complex.h提供的功能,但COMPLEX类型的变量是明显的指针,配合物数的表示如complex.c中所定义。

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

0

无效的typedef *

使用DLL来定义功能,使用您的项目

相关问题