Зачем использовать C typedefs, а не #defines? - PullRequest
11 голосов
/ 07 апреля 2010

В чем преимущество (если есть) использования typedef вместо #define в коде C?

Например, есть ли преимущество в использовании

typedef unsigned char UBYTE

над

#define UBYTE unsigned char

, когда оба могут использоваться как

void func()
{
        UBYTE byte_value = 0;

        /* Do some stuff */

        return byte_value;
}

Очевидно, что препроцессор попытается развернуть #define везде, где он его увидит, чего не произойдет с typedef, но мне это не кажется каким-то конкретным преимуществом или недостатком; Я не могу вспомнить ситуацию, когда любое использование не привело бы к ошибке сборки, если бы была проблема.

Ответы [ 5 ]

23 голосов
/ 07 апреля 2010

Если вы сделаете typedef для типа массива, вы увидите разницу:

typedef unsigned char UCARY[3];
struct example { UCARY x, y, z; };

Делаем это с помощью #define ... нет, давайте не будем идти туда.

[РЕДАКТИРОВАТЬ]: Другое преимущество состоит в том, что отладчики обычно знают о typedef, но не # define.

3 голосов
/ 07 апреля 2010

Ну, с точки зрения C ++, программист C ++, использующий ваш код, может иметь что-то вроде:

template<typename T> class String
{
     typedef T char_type;
     // ...
};

Теперь, если в вашем C-коде вы написали что-то вроде:

#define char_type uint32_t // because I'm using UTF-32

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

Я знаю, что вы пометили этот C, но программисты C и C ++ должны понимать, что их заголовки могут использоваться друг другом ... и это одна из тех вещей, о которых следует помнить.

2 голосов
/ 07 апреля 2010
  • Отладчики и сообщения об ошибках компилятора становятся более полезными, если компилятор / отладчик знает о типе. (это также то, почему вы должны использовать константы, а не определяет, где это возможно)
  • Массивы, как показали другие
  • вы можете ограничить typedefs меньшей областью действия (скажем, функцией). Еще более верно в C ++.
2 голосов
/ 07 апреля 2010

1) Вероятно, большое преимущество - более чистый код. Обычно злоупотребление макросами превращает код в неразбериху, известную как «макрос суп».

2) Используя typedef, вы определяете новый тип. Используя макрос, вы фактически заменяете текст. Компилятор, безусловно, более полезен при работе с ошибками typedef.

2 голосов
/ 07 апреля 2010

С #define все, что вы получаете - это подстановка строк во время предварительной обработки. typedef вводит новый тип. Это облегчает поиск возможных проблем в вашем коде, и в случае любого из них компилятор может предоставить вам более подробную информацию.

...