Интересно , одинаковы ли typedef
и #define
вс?
124
Нет.
#define
является токеном препроцессора: сам компилятор никогда его не увидит.
typedef
токен компилятора: препроцессору это не важно.
Вы можете использовать один или другой для достижения того же эффекта, но лучше использовать подходящий для ваших нужд.
#define MY_TYPE int
typedef int My_Type;
Когда что-то становится "волосатым", правильное использование правильного инструмента
#define FX_TYPE void (*)(int)
typedef void (*stdfx)(int);
void fx_typ(stdfx fx); /* ok */
void fx_def(FX_TYPE fx); /* error */
stdfx
допустимые объекты этого типа являются указателями на функции, которые получают int и не возвращают значение.void fx_def(void (*)(int) fx);
; правильное объявлениеvoid fx_def(void (*fx)(int));
.#define FX_TYPE(f) void (*f)(int)
. Затем вы объявляете свою функцию как:void fx_def(FX_TYPE(fx));
typedef
подчиняется правилам области видимости так же, как переменные, тогда какdefine
остается действительным до конца единицы компиляции (или до совпаденияundef
).Кроме того, с некоторыми вещами можно сделать то, с
typedef
чем нельзяdefine
.Например:
источник
Нет, они не такие. Например:
После предварительной обработки эта строка расширяется до
Надеюсь, вы заметили проблему; только
a
будет иметь типint *
;b
будет объявлен как обычныйint
(поскольку*
связан с декларатором, а не со спецификатором типа).Сравните это с
В этом случае оба
a
иb
будут иметь типint *
.Есть целые классы определений типов, которые нельзя эмулировать с помощью макроса препроцессора, например указатели на функции или массивы:
Попробуйте сделать это с помощью макроса препроцессора.
источник
#define определяет макросы.
typedef определяет типы.
Говоря об этом, вот несколько отличий:
С помощью #define вы можете определять константы, которые можно использовать во время компиляции. Константы можно использовать с #ifdef для проверки того, как компилируется код, и для специализации определенного кода в соответствии с параметрами компиляции.
Вы также можете использовать #define для объявления миниатюрных функций макроса поиска и замены .
typedef можно использовать для присвоения псевдонимов типам (что, вероятно, можно было бы сделать и с #define ), но это безопаснее из-за природы констант #define, основанной на поиске и замене .
Кроме того, вы можете использовать предварительное объявление с typedef, которое позволяет вам объявить тип, который будет использоваться, но еще не связан с файлом, в который вы пишете.
источник
Макросы препроцессора («
#define
s») - это инструмент лексической замены типа «поиск и замена». Они совершенно не зависят от языка программирования и не понимают, что вы пытаетесь сделать. Вы можете думать о них как о прославленном механизме копирования / вставки - иногда это полезно, но вы должны использовать его с осторожностью.Typedefs - это функция языка C, которая позволяет создавать псевдонимы для типов. Это чрезвычайно полезно для того, чтобы сделать сложные составные типы (например, структуры и указатели функций) удобочитаемыми и управляемыми (в C ++ есть даже ситуации, когда вы должны ввести тип).
Для (3): вы всегда должны предпочесть языковые функции макросам препроцессора, когда это возможно! Поэтому всегда используйте typedef для типов и постоянные значения для констант. Таким образом, компилятор действительно сможет осмысленно взаимодействовать с вами. Помните, что компилятор - ваш друг, поэтому вы должны рассказать ему как можно больше. Макросы препроцессора делают прямо противоположное, скрывая вашу семантику от компилятора.
источник
Они очень разные, хотя часто используются для реализации пользовательских типов данных (я предполагаю, что именно об этом и идет речь в этом вопросе).
Как упоминалось, pmg
#define
обрабатывается препроцессором (например, операция вырезания и вставки) до того, как компилятор увидит код, иtypedef
интерпретируется компилятором.Одно из основных отличий (по крайней мере, когда дело доходит до определения типов данных) заключается в том, что он
typedef
позволяет выполнять более конкретную проверку типов. Например,Здесь компилятор видит переменную x как int, а переменную y как тип данных, называемый tdType, который имеет тот же размер, что и int. Если вы написали функцию, которая принимает параметр типа defType, вызывающий может передать обычный int, и компилятор не заметит разницы. Если бы функция вместо этого приняла параметр типа tdType, компилятор обеспечит использование переменной правильного типа во время вызовов функции.
Кроме того, некоторые отладчики имеют возможность обрабатывать
typedef
s, что может быть намного полезнее, чем перечисление всех настраиваемых типов в качестве их базовых примитивных типов (как это было бы, если бы#define
вместо этого использовались).источник
Нет.
Typedef - это ключевое слово C, которое создает псевдоним для типа.
#define - это инструкция препроцессора, которая создает событие замены текста перед компиляцией. Когда компилятор доходит до кода, исходного слова "#defined" больше нет. #define в основном используется для макросов и глобальных констант.
источник
AFAIK, Нет.
typedef
помогает вам установить «псевдоним» для существующего типа данных. Например,typedef char chr
;#define
- это директива препроцессора, используемая для определения макросов или общих замен шаблонов. Например,#define MAX 100
, заменяет все вхождения наMAX
100источник
Как упоминалось выше, существует ключевое различие между
#define
и typedef. Правильный способ думать об этом - рассматривать typedef как полный «инкапсулированный» тип. Это означает, что вы не можете добавлять к нему после того, как вы его объявили.Вы можете расширить имя типа макроса другими спецификаторами типа, но не именем типа, определяемым по типу:
Кроме того, имя typedef'd предоставляет тип для каждого декларатора в объявлении.
После раскрытия макроса вторая строка становится такой:
Apple - это указатель на int, а banana - на int. В сравнении. typedef вроде этого:
заявляет, что яблоко и банан одно и то же. Имя на лицевой стороне отличается, но оба они указывают на символ.
источник
Как все говорили выше, они не такие. Большинство ответов указывают
typedef
на то, что выгоднее, чем#define
. Но позвольте мне отметить плюс#define
:когда ваш код очень большой, разбросанный по множеству файлов, его лучше использовать
#define
; это помогает в удобочитаемости - вы можете просто предварительно обработать весь код, чтобы увидеть фактическое определение типа переменной в месте ее объявления.источник