2010-04-02 16 views

Odpowiedz

24

z Wikipedii:

typedef jest kluczowe w językach programowania C++ i C. Celem typedef jest przypisywanie alternatywnych nazw istniejącym typom, najczęściej tym, których standardowa deklaracja jest uciążliwa, potencjalnie myląca lub może różnić się w zależności od implementacji.

I:

K & R stwierdza, że ​​istnieją dwa powody korzystania typedef. Po pierwsze zapewnia środki, dzięki którym program będzie bardziej przenośny. Zamiast zmieniać typ wszędzie, gdzie pojawia się on w plikach źródłowych programu, należy zmienić tylko jedną instrukcję typedef. Po drugie, typedef może ułatwić zrozumienie złożonej deklaracji.

A argument przeciw:

On (Greg K.H.) twierdzi, że praktyka ta nie tylko niepotrzebnie zaciemnia kod, może również powodować programiści przypadkowo nadużywać dużych struktur myślenia im być proste typy.

35

typedef jest za określenie czegoś jako typu. Na przykład:

typedef struct { 
    int a; 
    int b; 
} THINGY; 

... THINGY definiuje jako danej struktury. W ten sposób, można go używać tak:

THINGY t; 

... zamiast:

struct _THINGY_STRUCT { 
    int a; 
    int b; 
}; 

struct _THINGY_STRUCT t; 

... co jest nieco bardziej rozwlekły. typedefs może sprawić, że niektóre rzeczy będą bardziej czytelne, szczególnie wskaźniki dla funkcji.

+1

Czy istnieje jakiś powód, aby nie "typedef" a "struct", a następnie? – Panzercrisis

+1

@Panzercrisis: Nie jestem tego pewien, na pewno robiłem to rutynowo ~ 1989-1998 (lata, kiedy robiłem większość mojej pracy C), ale nie jestem już ekspertem od C (więcej). –

3

Może alias innego typu.

typedef unsigned int uint; /* uint is now an alias for "unsigned int" */ 
12

typedef służy do tworzenia aliasów do istniejących typów. To jest trochę z misnomer: typedef nie definiuje nowych typów, ponieważ nowe typy są zamienne z typem bazowym. Typedefs są często używane dla jasności i przenośności w definicjach interfejsów, gdy podstawowy typ może ulec zmianie lub nie ma znaczenia.

Na przykład:

// Possibly useful in POSIX: 
typedef int filedescriptor_t; 

// Define a struct foo and then give it a typedef... 
struct foo { int i; }; 
typedef struct foo foo_t; 

// ...or just define everything in one go. 
typedef struct bar { int i; } bar_t; 

// Typedef is very, very useful with function pointers: 
typedef int (*CompareFunction)(char const *, char const *); 
CompareFunction c = strcmp; 

typedef mogą również być wykorzystane do nadania nazwy dla nienazwanych typów. W takich przypadkach typedef będzie jedyną nazwą dla tego typu:

typedef struct { int i; } data_t; 
typedef enum { YES, NO, FILE_NOT_FOUND } return_code_t; 

Konwencje nazewnictwa są różne. Zwykle zaleca się używanie trailing_underscore_and_t lub CamelCase.

3

Typedef nie wprowadza nowego typu, ale po prostu podaje nową nazwę dla typu.

TYPEDEF mogą być wykorzystywane do:

  1. typów, które łączą w sobie tablice, konstrukcjom, wskazówek lub funkcji.

  2. Aby ułatwić przenoszenie, typedef wymagany typ. Następnie, po przeniesieniu kodu na różne platformy, wybierz odpowiedni typ, wprowadzając zmiany tylko w typie.

  3. A typedef może podać prostą nazwę dla skomplikowanego rzutowania typu.

  4. typedef może być również używany do nadawania nazw nienazwanym typom. W takich przypadkach typedef będzie jedyną nazwą tego typu.

UWAGA: -nie powinno USE TYPEDEF Z elemencie. ZAWSZE UŻYWAJ TAGĘ W DEFINICJI STRUKTURY, NAWET JEŚLI NIE POTRZEBUJE.

+2

Czy możesz rozwinąć nie używając typedef z structs, proszę? –

3

z Wikipedii: „.. K & R stwierdza, że ​​istnieją dwa powody korzystania typedef pierwsze ... Po drugie, typedef może złożoną deklarację łatwiejsze do zrozumienia”

Oto przykład do drugiego powodu zastosowania typedef upraszcza typów złożonych (typu złożonego pochodzi z K & R „języku C wydanie drugie, str. 136).

char (*(*x([])()) 

x oznacza funkcja powrocie wskaźnik do tablicy [] od wskaźnika funkcjonować powrocie char.

Możemy wykonać powyższe oświadczenie zrozumiałe użyciu typedefs. Proszę patrz poniższy przykład.

typedef char (*pfType)(); // pf is the type of pointer to function returning 
          // char 
typedef pfType pArrType[2]; // pArr is the type of array of pointers to 
          // functions returning char 

char charf() 
{ return('b'); 
} 

pArrType pArr={charf,charf}; 
pfType *FinalF()  // f is a function returning pointer to array of 
        // pointer to function returning char 
{ 
return(pArr); 
} 
1

Wyjaśnienie użycia typedef w poniższym przykładzie. Ponadto, Typedef jest używany do uczynienia kodu bardziej czytelnym.

#include <stdio.h> 
#include <math.h> 

/* 
To define a new type name with typedef, follow these steps: 
1. Write the statement as if a variable of the desired type were being declared. 
2. Where the name of the declared variable would normally appear, substitute the new type name. 
3. In front of everything, place the keyword typedef. 
*/ 

// typedef a primitive data type 
typedef double distance; 

// typedef struct 
typedef struct{ 
    int x; 
    int y; 
} point; 

//typedef an array 
typedef point points[100]; 

points ps = {0}; // ps is an array of 100 point 

// typedef a function 
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point) 

// prototype a function  
distance findDistance(point, point); 

int main(int argc, char const *argv[]) 
{ 
    // delcare a function pointer 
    distanceFun_p func_p; 

    // initialize the function pointer with a function address 
    func_p = findDistance; 

    // initialize two point variables 
    point p1 = {0,0} , p2 = {1,1}; 

    // call the function through the pointer 
    distance d = func_p(p1,p2); 

    printf("the distance is %f\n", d); 

    return 0; 
} 

distance findDistance(point p1, point p2) 
{ 
distance xdiff = p1.x - p2.x; 
distance ydiff = p1.y - p2.y; 

return sqrt((xdiff * xdiff) + (ydiff * ydiff)); 
} In front of everything, place the keyword typedef. 
    */ 
Powiązane problemy