Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив WinRAR / 2_Посібник_С_002.doc
Скачиваний:
39
Добавлен:
17.05.2015
Размер:
2.7 Mб
Скачать

7.2 Ключове слово typedef

Ключове слово typedef призначено для введення синонімів до назв існуючих типів.

Синтаксис застосування typedef:

typedef <назва існуючого типу> <назва синоніму>;

Приклад 11.Оголошення та використання typedef.

typedef unsigned long intULINT;

typedef floatFLT;

typedef charSomeString[55];

ULINT b; /* еквівалентно unsigned long int b; */

SomeString str[10]; /* Масив із 10 покажчиків на масив з 55

елеметів типу char (еквівалентно char

str[10][55]) */

Синонімічні типи, введені за допомогою typedef, подібно до змінних, можуть мати обмежену область видимості, або бути глобальними.

Приклад 13.Області видимості типів, введених за допомогою typedef.

#include <stdio.h>

#include <stdlib.h>

typedef intcntr; /* тип cntr доступний для всієї подальшої

програми */

cntr f(void)

{

staticcntr count=0;

return++count;

}

intvizov(void)

{

typedef intchislo_viklikiv; /* тип chislo_viklikiv не

можна використовувати за межами vizov() */

chislo_viklikiv c;

while((c=f())<250);

returnc;

}

int main(void)

{

printf("Chislo viklikiv funkcii f(): %d\n",vizov());

system("PAUSE");

return 0;

}

Результат роботи програми:

Програма, приведена у прикладі 13ілюструє обмеженість область видимості типу chislo_viklikiv, який введено локально для конкретної функції. Використання цього типу за межами функції vizov приведе до помилки на етапі компіляції.

За допомогою typedef можна вводити необмежену кількість синонімів до єдиного типу, навіть коли області видимості синонімів перетинаються.

Але введення двох синонімів з однаковим ім’ям навіть до різних типів в одній області видимості призведе до генерації компілятором помилки. Виключення становить перевизначення синонімів в різних програмних блоках. У цьому випадку перевизначений синонім стає локальним для даного блоку і його дія закінчується по закінченню програмного блоку.

Приклад 14. Превизначення синонімів

void f(void)

{

typedef unsigned int ui;

/* ... */

{

/* ... */

typedef int ui;/* локальне пере визначення ui */

/* ... */

}

/* ... */

}

typedef дозволяє одночасно вводити декілька синонімів до одного типу. У цьому випадку синоніми записуються через кому. Допустимо замість імені типу при використанні typedef приводити саме визначення типу.

Приклад 15.Одночасне введення декількох синонімів та визначення типу всередині typedef

#include <stdio.h>

#include <stdlib.h>

typedef unsigned long intDWORD;

typedef unsigned short intWORD;

typedef structtagBFHDR

{

WORD bfType;

DWORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;

} BFHDR, *PBFHDR;

intmain(void)

{

BFHDR bf;

BFHDR pbf = &bf;

pbf->bfType = 1;

bf.bfSize = 10;

printf(“%d\n”, pbf->bfSize + bf.bfType);

system(“PAUSE”);

return 0;

}

Результат роботи програми:

Код з прикладу 15 вводить у програму тип BFHDR, який є синонімом типу struct tagBFHDR та тип *PBFHDR, який є синонімом типу struct tagBFHDR*. Подальше використання введених синонімів нічим не відрізняється від використання типу-оригіналу, до якого ці синоніми були введені.

Слід застерегти від використання директиви препроцесора #define від використання в цілях подібних до typedef.

Приклад 16.Заміна typedef за допомогою директиви #define

#define char* PCHAR

typedef char* pchar;

voidf(void)

{

PCHAR pc1,pc2;/* УВАГА! Еквівалентно char* pc1,pc2; */

pchar pc3,pc4;/* Еквівалентно char *pc3,*pc4 */

/* … */

}

Припустимо нам необхідно об’явити чотири змінних типу вказівників на символ. На перший погляд ідентичні записи із прикладу 15на практиці призводять до дещо неочікуваних результатів. Із синтаксичної точки зору програма немає помилок і може бути успішно скомпільована, але за рахунок того що всі макропідстановки виконуються препроцесором ще до етапу компіляції і представляють собою просту заміну літералу PCHAR на char*, об’явлення змінної pc2 трактується компілятором як об’явлення змінної типу char.

Соседние файлы в папке Архив WinRAR