Тема: Де застосувати typedef

Я прочитав про typedef. Мені не зрозуміло навіщо він взагалі якщо я можу змінити ім'я вже існуючого типу за допомогою define. Для чого typedef (якщо є define) і де його було б розумно застосувати ?


Мій код який демонструє що define може замінити typedef

typedef int MyInt_TypeDef;

#define MyInt_Define int

int main()
{
    MyInt_TypeDef var1 = 6;
    MyInt_Define var2 = 7;

    cout << var1 << " " << var2;

    getch();
    return 0;
}

2

Re: Де застосувати typedef

в віртуальному конструкторі

3 Востаннє редагувалося Betterthanyou (02.12.2015 18:06:58)

Re: Де застосувати typedef

Прихований текст
coder написав:

в віртуальному конструкторі

Ото вже небезпечний, це не в цій темі віртуальний конструктор

4 Востаннє редагувалося coder (02.12.2015 19:59:38)

Re: Де застосувати typedef

якщо сeрйозно то typedef потрібно щоб давати аліаси для складних типів.

5 Востаннє редагувалося Betterthanyou (02.06.2016 15:41:15)

Re: Де застосувати typedef

coder написав:

якщо сeрйозно то typedef плтрібно щоб давати аліаси для складних типів.

ну так чим #define не влаштував творців мови що вони вирішили додати ще й typedef (Для чого typedef (якщо є define) - в запитані я ще питав)

6

Re: Де застосувати typedef

або щоб створювати типи адаптовані під бізнeс логіку:

typedef float Tax;
typedef float Total;
typedef float Price;
typedef int Qty;

Total getSubtotal(Price p, Qty q, Tax t) {
    return p * q + t;
}
Подякували: Betterthanyou1

7 Востаннє редагувалося coder (02.12.2015 19:59:56)

Re: Де застосувати typedef

Макроси глобальні, typedef можна використовувати на рівні класу або функції

8

Re: Де застосувати typedef

coder написав:

або щоб створювати типи адаптовані під бізнeс логіку:

typedef float Tax;
typedef float Total;
typedef float Price;
typedef int Qty;

Total getSubtotal(Price p, Qty q, Tax t) {
    return p * q + t;
}
#define Tax   float
#define Total float
#define Price float
#define Qty   int
 
Total getSubtotal(Price p, Qty q, Tax t) 
{ 
    return p * q + t;
}
Подякували: Betterthanyou1

9 Востаннє редагувалося coder (02.12.2015 20:42:58)

Re: Де застосувати typedef

coder написав:

Макроси глобальні, typedef можна використовувати на рівні класу або функції

Ще раз це повторю. Макроси глобальні і не можуть мати обмежену видимість на відміну від повноцінних типів які існують лише в контексті в якому вони задекларовані. У великих програмах є велика імовірність того що твій макрос законфліктує з якимось із існуючих в програмі імен.

І ще. Через макрос ти не зможеш зааліасити тип "вказівник на функцію".

typedef int(*fptr)(int, int);

int func(int a, int b) {
    return a + b;
}


int main(int argc, char argv[]) {

    fptr myPtr = &func;

    int sum = myPtr(2, 4);

    return 0;
}

Давай замініть тепер typedef на define.

10

Re: Де застосувати typedef

Betterthanyou написав:

Я прочитав про typedef. Мені не зрозуміло навіщо він взагалі якщо я можу змінити ім'я вже існуючого типу за допомогою define. Для чого typedef (якщо є define) і де його було б розумно застосувати ?


Мій код який демонструє що define може замінити typedef

typedef int MyInt_TypeDef;

#define MyInt_Define int

int main()
{
    MyInt_TypeDef var1 = 6;
    MyInt_Define var2 = 7;

    cout << var1 << " " << var2;

    getch();
    return 0;
}

Якби замість int було, наприклад, int[10], #define би з цим не впорався, а typedef — цілком.

11 Востаннє редагувалося Betterthanyou (03.12.2015 00:27:01)

Re: Де застосувати typedef

Прихований текст
P.Y. написав:
Betterthanyou написав:

Я прочитав про typedef. Мені не зрозуміло навіщо він взагалі якщо я можу змінити ім'я вже існуючого типу за допомогою define. Для чого typedef (якщо є define) і де його було б розумно застосувати ?


Мій код який демонструє що define може замінити typedef

typedef int MyInt_TypeDef;

#define MyInt_Define int

int main()
{
    MyInt_TypeDef var1 = 6;
    MyInt_Define var2 = 7;

    cout << var1 << " " << var2;

    getch();
    return 0;
}

Якби замість int було, наприклад, int[10], #define би з цим не впорався, а typedef — цілком.

Що за єресь

#include <iostream>
#include <conio.h>

using namespace std;

typedef int MyInt_TypeDef;

#define MyInt_Define int

int main()
{
    MyInt_TypeDef var1[10] = { 1,2,3,4,5,6,7,8,9,10 };
    MyInt_Define var2[10] = { 1,2,3,4,5,6,7,8,9,10 };

    cout << var1[1] << " " << var2[2];

    getch();
    return 0;
}

все робить

12

Re: Де застосувати typedef

Уявіть цей код без typedef-ів:

typedef (*twoParamFunc)(int, int);
typedef (*selectionFunc)(twoParamFunc, twoParamFunc, int, int);
selectionFunc selectors[10];

Крім того, в класичному C проголошення

struct a{int x;}

оголошує тип не a, а struct a. Щоб спростити запис типу, роблять

typedef struct {int x;} a;
Подякували: Betterthanyou1

13

Re: Де застосувати typedef

coder написав:
typedef int(*fptr)(int, int);

int func(int a, int b) {
    return a + b;
}


int main(int argc, char argv[]) {

    fptr myPtr = &func;

    int sum = myPtr(2, 4);

    return 0;
}

Давай замініть тепер typedef на define.

#include <iostream>
using namespace std;

static int __f(int, int);
#define fptr decltype(__f)* 

int func(int a, int b) {
    return a + b;
}
 
int main(int argc, char *argv[]) {
 
    fptr myPtr = &func;
    cout <<  myPtr(2, 4);
    return 0;
}

*SCRATCH*

Подякували: coder, Betterthanyou2

14 Востаннє редагувалося P.Y. (03.12.2015 13:08:25)

Re: Де застосувати typedef

Betterthanyou написав:
P.Y. написав:

Якби замість int було, наприклад, int[10], #define би з цим не впорався, а typedef — цілком.

Що за єресь

#include <iostream>
#include <conio.h>

using namespace std;

typedef int MyInt_TypeDef;

#define MyInt_Define int

int main()
{
    MyInt_TypeDef var1[10] = { 1,2,3,4,5,6,7,8,9,10 };
    MyInt_Define var2[10] = { 1,2,3,4,5,6,7,8,9,10 };

    cout << var1[1] << " " << var2[2];

    getch();
    return 0;
}

все робить

Малось на увазі, наприклад, таке:

typedef int MyInt_TypeDef[10];
//....
MyInt_TypeDef var1 = { 1,2,3,4,5,6,7,8,9,10 };
//....
Подякували: Betterthanyou1

15

Re: Де застосувати typedef

@0x9111A Зараховано! Костиль але вихід)

16

Re: Де застосувати typedef

coder написав:

@0x9111A Зараховано! Костиль але вихід)

Страуструп певно теж так думав коли робив С++

17

Re: Де застосувати typedef

0x9111A написав:
coder написав:

@0x9111A Зараховано! Костиль але вихід)

Страуструп певно теж так думав коли робив С++

Поясніть) не в'їхав)

18

Re: Де застосувати typedef

coder написав:

Поясніть) не в'їхав)

Жартую про то що С++ то набір костилів навішаних на няшну сішечку

19

Re: Де застосувати typedef

0x9111A написав:
coder написав:

Поясніть) не в'їхав)

Жартую про то що С++ то набір костилів навішаних на няшну сішечку

Я не сказав би що це абсолютний жарт. Погоджуся з цією думкою. С++ обріс великою кількістю фіч, але це скоріше природній процес а не забаганки творців мови. Фіча це відповідь на нові виклики і зміну вимог до програм. Іноді треба створити нову мову а іноді доводиться ліпити все в одну купу.

Подякували: 0x9111A, leofun012

20

Re: Де застосувати typedef

Про макроси і Страуструпа. В книзі Страуструпа "The C++ Programming Language" в главі про макроси є правила використання макросів і перше правило звучить так: "Не використовуйте макроси." :)

Подякували: leofun011