2010-04-07 2 views
11

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

В качестве примера, есть ли преимущество использования

typedef unsigned char UBYTE 

над

#define UBYTE unsigned char 

когда оба могут быть использованы в качестве

void func() 
{ 
     UBYTE byte_value = 0; 

     /* Do some stuff */ 

     return byte_value; 
} 

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

ответ

23

Если вы ЬурейиЙ типа массива, вы увидите разницу:

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

Doing что с #define ... нет, давайте не идти туда.

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

+9

Quot the preprocessor: «Злоупотребление мной, злоупотребляйте мной .. Заставьте меня почувствовать желание!» +1 –

+0

Я делаю препроцессор злоупотребления справедливым битом, но не для типов, если нет другого пути. (Мне понадобилось это * один раз * за последние 20 лет при написании кода для кросс-платформенной 64-битной целочисленной обработки. Это было удивительно сложно для компиляторов, доступных в то время, и в итоге появилось больше #ifdefs, чем у меня было бы предпочтительнее.) –

+0

Также используются типы указателей функций ... – hugomg

2

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

+1

не совсем * новый * тип - это псевдоним для существующего типа, но тип, который есть, да – philsquared

3

Ну, исходя из 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++ должны понимать, что их заголовки могут использоваться друг другом ... и это одна из тех вещей, которые нужно иметь в виду.

2

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

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

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