Форум программистов, компьютерный форум CyberForum.ru

Как работает оператор typedef - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 373, средняя оценка - 4.86
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
13.03.2010, 23:57     Как работает оператор typedef #1
как работает оператор typedef
если есть у кого сам код то пришлите,интересно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2010, 23:57     Как работает оператор typedef
Посмотрите здесь:

Оператор typedef C++
Как работает оператор new? C++
C++ Как работает оператор if?
C++ Как работает оператор char *! Спасибо заранее!
C++ Как работает оператор switch?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
14.03.2010, 00:24     Как работает оператор typedef #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Хороший вопрос.
Он как бы заменяет последнее слово на все что от typedef до этого последнего слова.
typedef int XYZ; И дальше (в области видимости) ты всюду вместо int можешь писать свое XYZ,
тебя поймут.
В данном примере это кажется бессмысленностью, однако все современные трансляторы очень любят этот прием
Другой Пример
typedef struct { int a; long b; XYZ c; } MYTYP;
Теперь ты можешь смело сказать
MYTYP *MT;
И потом
MT-> b = MT->a + MT->c
и тебя опять поймут
Когда серьезно работаешь со структурами, это бывает удобно
Есть альтернатива
struct MYSTR { int a; long b; XYZ c; } ;
А дальше
struct MYSTR *MT; - далее все также. Дело вкуса. ИМХО, лишнее слово struct
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.03.2010, 00:53     Как работает оператор typedef #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Day Посмотреть сообщение
Он как бы заменяет последнее слово на все что от typedef до этого последнего слова.
typedef ничего не заменяет, не путай ни себя, ни человека.

МедведЪ, объявление, начинающееся с ключевого слова typedef, вводит новое имя для типа.

Пример:
C++
1
typedef unsigned long ulong;
После этого тип ulong можно использовать как синоним типа unsigned long.
Это позволяет достичь более короткой формы записи.

Наиболее эффективно использование typedef при определении синонимов для сложносоставных типов:

C++
1
2
3
typedef pair<float,float> Point2D;
typedef pair<bool,Point2D> CrossPoint;
typedef pair<bool,pair<float,float> > CrossPoint;
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
14.03.2010, 01:00     Как работает оператор typedef #4
CyBOSSeR, тебе тоже не спится? Не сердись.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.03.2010, 01:05     Как работает оператор typedef #5
Day, я не сержусь. Просто старайся выражаться более корректно. А то можно подумать что строка:
C++
1
typedef unsigned long ulong;
идентична строке:
C++
1
#define ulong unsigned long
, что с точки зрения языка C++ в принципе не верно, хотя результат будет идентичным.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.03.2010, 05:45     Как работает оператор typedef #6
Цитата Сообщение от Day Посмотреть сообщение
Другой Пример
typedef struct { int a; long b; XYZ c; } MYTYP;
Теперь ты можешь смело сказать
MYTYP *MT;
И потом
MT-> b = MT->a + MT->c
и тебя опять поймут
Когда серьезно работаешь со структурами, это бывает удобно
Нужно заметить, что при создании структур в C++ typedef не нужен, т.к. имя нового типа становится известно компилятору, и при объявлении объектов этого типа не нужно явно указывать ключевое слово struct:
C++
1
2
3
4
5
6
7
8
9
struct mystruct
{
    int a;
    double b;
};
//...
//Объявление объекта типа mystruct:
mystruct S1, *pS;
//...
Если пишешь код в C++, то typedef тебе понадобится только в том случае, который описал CyBOSSeR - создание псевдонимов для (сложных) типов данных
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
14.03.2010, 09:58  [ТС]     Как работает оператор typedef #7
люди я знаю как его юзатьСам делаю так
C++
1
typedef unsigned int uint
но мне интересен сам его код,как он объявлен и т.д.
Цитата Сообщение от Day Посмотреть сообщение
typedef struct { int a; long b; XYZ c; } MYTYP;
Теперь ты можешь смело сказать
MYTYP *MT;
И потом
MT-> b = MT->a + MT->c
про это пожалуйста подробно, так динамически объявляется что ли,когда использую вместо точку ->
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
14.03.2010, 10:37     Как работает оператор typedef #8
но мне интересен сам его код,как он объявлен и т.д.
Никакого кода нет. Это ключевое слово (как for, while ...)
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
14.03.2010, 10:40  [ТС]     Как работает оператор typedef #9
Day, они же как то объясняются компилятору что и как?почему компилятор думает что тут ошибка?
C++
1
for(int i=0;i++)
потому что ему сказано что там должно быть совершено 3ье действие...так откуда же взять код typedef-a
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
14.03.2010, 11:00     Как работает оператор typedef #10
Это прошито в сам компилятор. Если тебе хочется видеть "код", качай исходники компилятора. Например, gcc.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
14.03.2010, 11:16  [ТС]     Как работает оператор typedef #11
Nick Alte, как и где
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
14.03.2010, 11:34     Как работает оператор typedef #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это позволяет достичь более короткой формы записи.
Необязательно более короткой. Можно, например, более понятную запись. Известно, что в языке Си размеры типов неспецифецированы. Иногда это крайне неудобно, потому что для большого класса задач нужны такие понятия как "целый тип размером в 2 байта", "целый тип размером в 4 байта" и т.п., а потому при использовании базовых типов неудобно писать переносимые программы. Такое обычно так же разруливают через typedef'ы. Обычно заводят файл с описаниями типов, где в зависимости от host-платформы их определяют тем или иным способом (макросы типа __MSDOS__ и __WINDOWS32__ обозвал условно):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifdef __MSDOS__
/* Настройка типов для 16-разрядных систем */
typedef char int8_t;
typedef int int16_t;
typedef long int32_t;
typedef struct { int32_t hi, lo; } int64_t;
#elif (defined __linux__ && ! defined _NP64) || (defined __WINDOWS32__)
/* Настройка типов для 32-разрядных систем */
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
#else
/* Настройка типов для 64-разрядных систем */
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long int64_t;
#endif
И далее везде пользуются типами int8_t, int16_t, int32_t, int64_t. Если мы начинаем работать на какой-то системе, где размеры базовых типов устроены по другому, то мы просто заведём для этой системы свой набор typedef'ов и не будем трогать весь остальной код

Добавлено через 3 минуты
Цитата Сообщение от МедведЪ Посмотреть сообщение
Day, они же как то объясняются компилятору что и как?почему компилятор думает что тут ошибка?
C++
1
for(int i=0;i++)
потому что ему сказано что там должно быть совершено 3ье действие...так откуда же взять код typedef-a
Пока ты внятно вопрос не поставишь, врядли кто-то тебе на него ответит. typedef просто ОБЪЯВЛЯЕТ новый (пользовательский) тип. Больше он ничего не делает. Объявление типа (как и вообще любой тип) в код НЕ преобразовывается, потому как тип - это свойство языка программирования. В процессоре нет понятия типа. Правда если быть на 100% корректным, то есть некоторые защищённые архитектуры, в которых вводится аппаратное понятие типа, но все подобные архитектуры постфакутм являются неудавшимися экспериментами и покоятся в помойке
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
14.03.2010, 11:43     Как работает оператор typedef #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <list>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
 
typedef long long LL;
typedef vector<int> VI;
typedef vector<VI> VII;
 
#define ALL(a) a.begin(), a.end()
#define sz size()
#define pb(a) push_back(a)
#define FOR(i,a,b) for (int i(a), _n(b); i < _n; ++i)
 
const LL base = 1000*1000*1000;
 
VI res;
VI &operator * (VI a, VI b)
{
    res.clear();
    res = VI(a.sz + b.sz);
    FOR(i,0,a.sz)
    {
        for (int j = 0, carry = 0; j < b.sz || carry; ++j)
        {
            LL cur = res[i+j] + a[i] * LL( j < b.sz ? b[j] : 0 ) + carry;
            res[i+j] = cur % base;
            carry = int(cur / base);
        }
    }
    while (res.sz && !res.back()) res.pop_back();
    return res;
}
 
VI BinPow(const int &a, int &n)
{
    VI res(1,1), b(1,a);
    while (n)
    {
        if (n&1)
        {
            --n;
            res = res * b;
        }
        else
        {
            n >>= 1;
            b = b * b;
        }
    }
    return res;
}
 
int main()
{ 
    VI v;
    int a, n;
    scanf("%d%d", &a, &n);
    v = BinPow(a, n);
    printf("%d", v.back());
    for(int i = v.sz-2; i >= 0; --i)
        printf("%06d", v[i]);
    printf("\n");
    system ("pause");
}
Это типа пример использования
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
14.03.2010, 11:53     Как работает оператор typedef #14
Строки 28 и 67 этого кода, а так же 18 и 37, напоминают мне фразу из предисловия книги "практика программирования"

... и часто создатели очередной стройной системы программирования становятся жертвами этой стройности.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
14.03.2010, 11:55  [ТС]     Как работает оператор typedef #15
outoftime, мне интересен исходный код этого оператора
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
14.03.2010, 12:17     Как работает оператор typedef #16
Цитата Сообщение от МедведЪ Посмотреть сообщение
outoftime, мне интересен исходный код этого оператора
А исходный код оператора "int" тебе интересен?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
14.03.2010, 13:39     Как работает оператор typedef #17
Цитата Сообщение от Evg Посмотреть сообщение
Строки 28 и 67 этого кода, а так же 18 и 37, напоминают мне фразу из предисловия книги "практика программирования"
Цитата:
... и часто создатели очередной стройной системы программирования становятся жертвами этой стройности.
Странно, лично меня всё устраивает..

Добавлено через 1 минуту
Цитата Сообщение от МедведЪ Посмотреть сообщение
outoftime, мне интересен исходный код этого оператора
а мне нет, все что язнаю, что typedef создает "синоним" типу, вот и все.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
14.03.2010, 14:34     Как работает оператор typedef #18
Цитата Сообщение от МедведЪ Посмотреть сообщение
как и где
Ну поскольку это open source разработка, то качать исходники лучше с официального сайта: http://gcc.gnu.org/
А уж где именно в исходниках, это ищи самостоятельно...
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.03.2010, 15:27     Как работает оператор typedef #19
Цитата Сообщение от МедведЪ Посмотреть сообщение
про это пожалуйста подробно, так динамически объявляется что ли,когда использую вместо точку ->
Никакого "динамического" объявления нет. Если ты не заметил, то объявляется указатель на объект типа структуры. Для объекта типа структуры (или класса) доступ к ее членам происходит с помощью оператора ".", а для указателя - с помощью оператора "->".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2010, 15:36     Как работает оператор typedef
Еще ссылки по теме:

C++ Как объявить указатель на массив через typedef и как инициализировать такой тип
Что за оператор typedef? C++
C++ Как работает тернарный оператор

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Доктор ТуамОсес
Заблокирован
04.11.2010, 15:36     Как работает оператор typedef #20
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
как работает оператор typedef
ТУТ посмотри

Добавлено через 16 минут
C++
1
2
3
typedef struct S1 { char *name; } S2, (*S5)[10] ;
typedef struct { char *name; } S3 ;
struct S4 { char *name; } ;
В чём разница между S1,S2,S3 и S4?
И что такое S4?
Yandex
Объявления
04.11.2010, 15:36     Как работает оператор typedef
Ответ Создать тему
Опции темы

Текущее время: 12:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru