Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Разница между typedef и #define

#c #cpp


В чем состоит разница между typedef и #define?
    


Ответы

Ответ 1



Разница в том, что оператор typedef добавляет новое имя к уже существующим. Директива #define - это команда препроцессора. typedef поддерживается на уровне языка.

Ответ 2



#define - это директива автозамены. То есть он заменяет то, чем макрос именовали, тем, что в нём указали. И всё. Больше он ничего не делает. Другое дело, что таким образом объявленные макросы можно использовать в условиях, но это уже не по вопросу. typedef - объявляет новый производный тип. И всё =) Наглядное сравнение (простите за такое название, но наглядности ради): #define macroint int * typedef int * typedint; macroint a, b; // превратится в такое: int * a, b; typedint c, d; При этом типы получаются: a - int * b - int (!!!) c - typedint == int * d - typedint == int *

Ответ 3



#define - это директива препроцессора. Она позволяет объявить макрос, именованный фрагмент текста программы. И использовать идентификатор макроса в тексте программы, как будто это сам фрагмент. Поэтому директива #define служит для замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. typedef создает псевдоним(alias) для типа или функции. Если использовать эти конструкции для замены вида int * на pint, то разница лишь в том, что typedef учитывает namespace, а #define всегда глобальны. #define pchar char * namespace t{ typedef int * pint; } int main() { pchar h; t::pint g; pint g2; // ошибка return 0; } Ну и еще с помощью #define можно делать гарантированные инлайн функции и работать с #ifdef #define mul(x, y) ((x) * (y)) a = mul(5, 3 + 6); // будет заменено препроцессором на a = (5)*(3 + 6); #define MY_DEBUG ... #ifdef MY_DEBUG // фрагмент будет скомпилирован, только если объявлен MY_DEBUG MyMegaApp.doMoreChecks(); #endif Можно наверно еще что-то добавить.

Ответ 4



#define объявляет макросы, подстановкой (в том числе рекурсивной) которых занимается препроцессор, а не компилятор. соответственно, никаких проверок и типа и тому подобной ереси, иногда бывает полезно.

Комментариев нет:

Отправить комментарий