Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: (ст) Что такое typedef и чем он отличается от #define ?  (Прочитано 28806 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NetRaider
Гость
« : 20-11-2003 07:20 » 

Спецификатор typedef вводит синоним для существующего типа.

Например:

Код:
typedef int integer;
typedef const char* pchar;
...
integer a = 10;
pchar s = "abcd";
   
С помощью typedef невозможно переопределить тип, разрешено только вводить новые имена-синонимы.
Таким образом:

Код:
struct A {};
typedef int A; // error

Основные отличия от #define:

#define является директивой препроцессора и, как следствие, обрабатывается перед компиляцией путем простой замены всех вхождений. К чему это может привести, иллюстрирует следующий пример:
Код:
#define P_INT int*
typedef int* p_integer;

                   // эквивалентно
P_INT p1, p2;      // int* p1, int p2;
p_integer p3, p4; // int* p3, int* p4;

int* a;

p1 = a; // ok      int* p1
p2 = a; // error   int  p1
p3 = a; // ok      int* p3
p4 = a; // ok      int* p4

На первый взгляд тип и синоним типа выглядят одинаково, но при использовании typedef несколько иначе обрабатываются cv-квалификаторы(в отличие от #define):
Код:
typedef char* pchar;
#define PCHAR char*

const pchar a;   // char* const
const PCHAR b; // const char* == char const* != char* const
PCHAR const c; // char* const


С помощью #define нельзя объявить имя функции или массива, но можно используя typedef. Синтаксис объявления массива таков

typedef int int_array[10];

Следует заметить что так неправильно:

typedef int[10] int_array; // error

Теперь о функциях...

В связи с тем, что typedef не вводит нового типа следующий код будет ошибочным:
Код:
void f(int a) { ... }
void f(integer a) { ... } // error - функция с такой сигнатурой
                                  // и именем уже существует
Рассмотрим как создаются типы-синонимы для функций:

Для функции вида void f1(int);
объявлением нового синонима служит следующая запись

typedef void(*pfn_f)(int);

где pfn_f имя синонима. Вызов этой функции с использование нового имени происходит просто:
Код:
pfn_f pf = f1; // Создали переменную 'указатель на функцию' и
                                  // присвоили ей значение
pf(10); // Произвели вызов
Еще несколько примеров:
Код:
void f1(int);
void f2(int);
typedef void(*pfn_f)(int);

int f3(int, char*, double);
typedef int(*pfn_f3)(int, char*, double);

int main()
{
    pfn_f pf = f1;
    pf(10);  // f1(int)
    pf = f2;
    pf(1);    // f2(int)

    pfn_f3 pf2 = f3;
    pf2(10, "abc", 12.4);    // f3(int, char*, double)

return 0;
}
typedef'ы широко применяются в WinApi для CALLBACK функций, а также для типов.

Еще одним отличием служит область видимости, для typedef'a ограниченная функцией, классом, или пространством имен.
В заключении можно добавить что производные классы(в т.ч. шаблонные) наследуют типы объявленные с помощью typedef'ов в базовых классах.
« Последнее редактирование: 21-11-2007 16:37 от Алексей1153++ » Записан
grozny
Гость
« Ответ #1 : 20-11-2003 21:14 » 

с технической точки зрения, ответ есть "ничем особо не отличается, кроме синтаксиса". Typedef - текстуальная подстановка (т.е. такое же макро, как и define) этапа компиляции и никаким переопределением типа здесь и не пахнет. Главное отличие - это текстовое  макро этапа компиляции, а не предобработки (как define). Т.е. исполняется _после_ всех #define

Ну и ограничение видимости - есть такой очень полезный момент.
Записан
NetRaider
Гость
« Ответ #2 : 21-11-2003 01:59 » 

Цитата

NetRaider, а почему здесь - на форуме - статьи посылать на сайт по почте

 
По моему это на статью не тянет... У меня сейчас время свободное есть, могу еще что нибудь написать, только не в больших объемах. Хотельсь бы узнать, какие темы больше всего интересны общественности.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 19-04-2006 17:22 » new

Тема занята Михалычем

Статьи тут:
Что такое typedef, и чем он отличается от #define?
Что такое typedef, и чем он отличается от #define? Часть 2.
« Последнее редактирование: 11-05-2009 19:38 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines