Почему использование C определения типов, а не #defines?

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

Как пример, там любое преимущество для использования

typedef unsigned char UBYTE

#define UBYTE unsigned char

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

void func()
{
        UBYTE byte_value = 0;

        /* Do some stuff */

        return byte_value;
}

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

11
задан me_and 7 April 2010 в 12:43
поделиться

5 ответов

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

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

Делая это с #define ... нет, не будем туда идти.

[EDIT]: Еще одно преимущество состоит в том, что отладчики обычно знают о typedefs, но не #defines.

23
ответ дан 3 December 2019 в 02:30
поделиться

Что ж, исходя из точки зрения 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 в разных областях ... в то время как области не соблюдаются с помощью #defines.

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

3
ответ дан 3 December 2019 в 02:30
поделиться

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

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

2
ответ дан 3 December 2019 в 02:30
поделиться

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

2
ответ дан 3 December 2019 в 02:30
поделиться
  • Отладчики и сообщения об ошибках компилятора становятся более полезными, если компилятор / debugger знает о типе. (именно поэтому вы должны использовать константы, а не определения там, где это возможно)
  • Массивы, как показали другие
  • , вы можете ограничить typedef меньшей областью (скажем, функцией). Тем более верно в C ++.
2
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: