Что преимущество (если таковые имеются) там к использованию 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
, но это, кажется, мне не конкретное преимущество или недостаток; я не могу думать о ситуации, где любое использование не привело бы к ошибке сборки, если бы была проблема.
Если вы выполните typedef для типа массива, вы увидите разницу :
typedef unsigned char UCARY[3];
struct example { UCARY x, y, z; };
Делая это с #define ... нет, не будем туда идти.
[EDIT]: Еще одно преимущество состоит в том, что отладчики обычно знают о typedefs, но не #defines.
Что ж, исходя из точки зрения 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 ++ должны понимать, что их заголовки могут использоваться друг другом ... и это одна из тех вещей, о которых следует помнить.
1) Вероятно, большим преимуществом является более чистый код. Обычно злоупотребление макросами превращает код в неразбериху, известную как «суп макросов».
2) Используя typedef, вы определяете новый тип. Используя макрос, вы фактически заменяете текст. Компилятор, безусловно, более полезен при работе с ошибками typedef.
С #define
все, что вы получаете, - это подстановка строк во время предварительной обработки. typedef
представляет новый тип. Это упрощает поиск возможных проблем в вашем коде, и в случае возникновения каких-либо проблем компилятор может предоставить вам более подробную информацию.