Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 373, средняя оценка - 4.86
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,341
Завершенные тесты: 1
#1

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

13.03.2010, 23:57. Просмотров 49369. Ответов 27
Метки нет (Все метки)

как работает оператор typedef
если есть у кого сам код то пришлите,интересно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2010, 23:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как работает оператор typedef (C++):

Оператор typedef - C++
Имеет ли смысл говорить о времени жизни, области видимости и о связывании для типов (НЕ ПЕРЕМЕННЫХ), которые определяются этой директивой?

Что за оператор typedef? - C++
Доброго всем времени суток. Получил задание написать про оператор typedef, пересмотрел кучу книг но так и не смог ничего найти....

Не работает typedef с шаблонным классом - C++
доброго времени суток форумчане есть функция с консольной менюшкой, в нее приходит аргумент, определяющий который тип использовать ...

Как работает оператор new? - C++
Обязательно ли использовать оператор delete в коде (см.ниже.).После использования оператора new старая область память выделенная для pStr...

Как работает оператор if? - C++
Народ! Операция сравнения возвращает ЧИСЛО, т.е. while и if принимают ЧИСЛО (0 - false, etc - true). Вопрос 1) Почему нельзя записать...

Как работает тернарный оператор - C++
Здравствуйте. Объясните, пожалуйста, что значит эта строка color = (color == 'W') ? 'B' : 'W';

27
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
14.03.2010, 00:24 #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
8
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.03.2010, 00:53 #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;
5
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
14.03.2010, 01:00 #4
CyBOSSeR, тебе тоже не спится? Не сердись.
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.03.2010, 01:05 #5
Day, я не сержусь. Просто старайся выражаться более корректно. А то можно подумать что строка:
C++
1
typedef unsigned long ulong;
идентична строке:
C++
1
#define ulong unsigned long
, что с точки зрения языка C++ в принципе не верно, хотя результат будет идентичным.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
14.03.2010, 05:45 #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 - создание псевдонимов для (сложных) типов данных
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,341
Завершенные тесты: 1
14.03.2010, 09:58  [ТС] #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
про это пожалуйста подробно, так динамически объявляется что ли,когда использую вместо точку ->
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
14.03.2010, 10:37 #8
но мне интересен сам его код,как он объявлен и т.д.
Никакого кода нет. Это ключевое слово (как for, while ...)
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,341
Завершенные тесты: 1
14.03.2010, 10:40  [ТС] #9
Day, они же как то объясняются компилятору что и как?почему компилятор думает что тут ошибка?
C++
1
for(int i=0;i++)
потому что ему сказано что там должно быть совершено 3ье действие...так откуда же взять код typedef-a
0
Nick Alte
Эксперт С++
1641 / 1013 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
14.03.2010, 11:00 #10
Это прошито в сам компилятор. Если тебе хочется видеть "код", качай исходники компилятора. Например, gcc.
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,341
Завершенные тесты: 1
14.03.2010, 11:16  [ТС] #11
Nick Alte, как и где
0
Evg
Эксперт CАвтор FAQ
18261 / 6386 / 440
Регистрация: 30.03.2009
Сообщений: 17,671
Записей в блоге: 28
14.03.2010, 11:34 #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% корректным, то есть некоторые защищённые архитектуры, в которых вводится аппаратное понятие типа, но все подобные архитектуры постфакутм являются неудавшимися экспериментами и покоятся в помойке
4
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
14.03.2010, 11:43 #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");
}
Это типа пример использования
0
Evg
Эксперт CАвтор FAQ
18261 / 6386 / 440
Регистрация: 30.03.2009
Сообщений: 17,671
Записей в блоге: 28
14.03.2010, 11:53 #14
Строки 28 и 67 этого кода, а так же 18 и 37, напоминают мне фразу из предисловия книги "практика программирования"

... и часто создатели очередной стройной системы программирования становятся жертвами этой стройности.
1
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,341
Завершенные тесты: 1
14.03.2010, 11:55  [ТС] #15
outoftime, мне интересен исходный код этого оператора
0
14.03.2010, 11:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2010, 11:55
Привет! Вот еще темы с ответами:

Как работает оператор char *? - C++
Как работает оператор char *! Можете описать его принцип работы! Спасибо заранее!

Как работает оператор switch? - C++
Shape* generator() { switch(rand() % 3) { case 0: return new Triangle; case 1: return new Rectangle; case 2: return new...

Уточнение о том как работает оператор for - C++
Я правильно понимаю? Оператор for, сперва будет работать только с первым выражением до тех пор, пока оно не станет ложным не переходя ко...

Как работает оператор new, он же _Znwj на асме - C++
Собственно как действительно он работает? То есть что реально происходит какие инструкции (грубо говоря) он выполняет? Откуда проц (в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru