2012-02-23 50 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來定義功能,使用您的項目