Поиск по сайту:

Учебник по программированию на C для Linux, часть 28 — Typedefs


На этой странице

  1. Typedef на языке программирования C
  2. Заключение

В этом руководстве, которое является частью продолжающейся серии руководств по программированию на C, мы обсудим концепцию typedef. Как следует из названия (подумайте о typedef как о type+def), typedef — это предоставляемая C возможность определять новые имена для существующих типов данных.

Typedef на языке программирования C

Вот пример, показывающий, как можно использовать typedef:

typedef int my_int

Строка выше, начинающаяся с ключевого слова typedef, дает типу данных int новое имя: my_int. Итак, такой код:

#include <stdio.h>

int main()
{
int a = 10;
printf("The value of a is: %d", a);

return 0;
}

При использовании только что рассмотренного примера typedef можно написать следующее:

#include <stdio.h>

typedef int my_int;

int main()
{
my_int a = 10;
printf("The value of a is: %d", a);

return 0;
}

Теперь один вопрос, который могут задать некоторые: в чем разница между typedef и #define? Что ж, хотя оба, кажется, делают похожие вещи, на самом деле между ними довольно много различий.

Во-первых, typedef интерпретируется компилятором, тогда как #define никогда не доходит до стадии компиляции, так как интерпретируется на самой стадии предварительной обработки. Затем typedef следует правилам области действия, а #define — нет. Ниже приведен пример этого:

#include <stdio.h>

void my_func();

int main()
{
typedef int my_int;
my_int a = 10;
printf("The value of a is: %d", a);
my_func();

return 0;
}

void my_func()
{
my_int b = 20;
printf("The value of a is: %d", b);

return;
}

Когда этот код выполняется, вы получаете следующую ошибку:

main.c: In function ‘my_func’:
main.c:25:5: error: unknown type name ‘my_int’
my_int b = 20;
^

Итак, как видите, компилятор не смог распознать тип my_int в функции my_func, поскольку область действия, в которой typedef была допустима, была областью действия основной функции.

Кроме того, есть некоторые другие различия между typedef и #define. Например, используя #define, вы также можете создавать псевдонимы для постоянных значений — я имею в виду, что вы можете сделать что-то вроде #define PIE 3.14. Кроме того, как вы уже заметили, #define не заканчивается точкой с запятой, в отличие от typedef.

Теперь все еще можно спросить, зачем нам нужен typedef. Или, другими словами, где действительно пригодится typedef? Что ж, предположим, что есть фрагмент кода с функциями, которые возвращают указатель на функцию, которая принимает два целых числа в качестве аргументов, поскольку возвращает символьное значение.

Если вы не в курсе, такой указатель объявляется следующим образом:

char (*fn_ptr) (int, int);

Где fn_ptr — имя такого указателя.

Таким образом, вместо того, чтобы снова и снова использовать такое длинное и сложное объявление в качестве возвращаемого типа других функций, вы можете просто сделать fn_ptr типом, используя typedef:

typedef char (*fn_ptr) (int, int);

А теперь можно просто использовать fn_ptr, и это будет означать указатель такого типа.

Другое использование typedef включает использование в коде определяемого пользователем типа данных, который соответствует собственному типу, предоставляемому базовой платформой, на которой выполняется код. Таким образом, определения типов помогают упростить понимание и поддержку любого фрагмента кода, разработанного для работы на нескольких платформах.

Заключение

Итак, в этом руководстве мы обсудили основы определения типов, в том числе то, что делает typedef, чем оно отличается от директивы #define и как определения типов могут сэкономить вам время, упрощая чтение, понимание и обслуживание кода.

Вам рекомендуется попробовать примеры, которые мы использовали здесь, а также разработать дополнительные примеры, чтобы лучше понять typedefs, и, как всегда, в случае каких-либо сомнений или вопросов, оставьте комментарий ниже.