C - typedef vs #define [duplicate]

In [30]: pd.Series([1,2,3,4,'.']).convert_objects(convert_numeric=True)
Out[30]: 
0     1
1     2
2     3
3     4
4   NaN
dtype: float64
100
задан jww 27 March 2016 в 06:34
поделиться

9 ответов

Нет.

#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 */
100
ответ дан pmg 28 August 2018 в 07:54
поделиться

typedef подчиняется правилам видимости, аналогичным переменным, тогда как define остается действительным до конца файла (или до соответствия undef).

Кроме того, некоторые вещи могут быть выполнены с помощью typedef, что невозможно сделать с помощью define.

Примеры:

typedef int* int_p1;
int_p1 a, b, c;  // a, b, and c are all int pointers.

#define int_p2 int*
int_p2 a, b, c;  // only the first is a pointer!

.

typedef int a10[10];
a10 a, b, c; // create three 10-int arrays

.

typedef int (*func_p) (int);
func_p fp // func_p is a pointer to a function that
          // takes an int and returns an int
201
ответ дан Andreas Grech 28 August 2018 в 07:54
поделиться

Нет, они не то же самое. Например:

#define INTPTR int*
...
INTPTR a, b;

После предварительной обработки эта строка расширяется до

int* a, b;

. Надеемся, вы увидите проблему; только a будет иметь тип int *; b будет объявлен простой int (поскольку * связан с объявлением, а не с спецификатором типа).

Контрастность с

typedef int *INTPTR;
...
INTPTR a, b;

В этом случае оба a и b будут иметь тип int *.

Существуют целые классы typedefs, которые нельзя эмулировать с помощью макроса препроцессора, например указатели на функции или массивы:

typedef int (*CALLBACK)(void);
typedef int *(*(*OBNOXIOUSFUNC)(void))[20]; 
...
CALLBACK aCallbackFunc;        // aCallbackFunc is a pointer to a function 
                               // returning int
OBNOXIOUSFUNC anObnoxiousFunc; // anObnoxiousFunc is a pointer to a function
                               // returning a pointer to a 20-element array
                               // of pointers to int

Попробуйте сделать это с помощью макроса препроцессора.

21
ответ дан John Bode 28 August 2018 в 07:54
поделиться

Макросы препроцессора ("#define 's") являются лексическим инструментом замены a la "поиск и замена". Они полностью агностичны для языка программирования и не понимают, что вы пытаетесь сделать. Вы можете думать о них как о прославленном механизме копирования / вставки - иногда это полезно, но вы должны использовать его с осторожностью.

Typedefs - это функция языка C, которая позволяет создавать псевдонимы для типов. Это чрезвычайно полезно для чтения сложных и сложных команд сложных типов (например, структур и указателей функций) (в C ++ существуют ситуации, когда вы должны typedef a type).

Для ( 3). Когда это возможно, вы всегда должны предпочесть языковые функции поверх макросов препроцессора! Поэтому всегда используйте typedefs для типов и постоянные значения для констант. Таким образом, компилятор может реально взаимодействовать с вами. Помните, что компилятор - ваш друг, поэтому вы должны рассказать об этом как можно больше. Макросы препроцессора делают полную противоположность , скрывая вашу семантику от компилятора.

4
ответ дан Kerrek SB 28 August 2018 в 07:54
поделиться

#define определяет макросы. typedef определяет типы.

Теперь, сказав это, вот несколько отличий:

С помощью #define вы можете определить константы, которые можно использовать во время компиляции. Константы можно использовать с #ifdef для проверки того, как компилируется код, и специализировать определенный код в соответствии с параметрами компиляции. Вы также можете использовать #define, чтобы объявить миниатюрные функции поиска и замены Макрофункции .

typedef можно использовать для предоставления псевдонимов типам (что вы, вероятно, могли бы сделать с #define как хорошо), но это безопаснее из-за находки и замены характера констант #define. Кроме того, вы можете использовать forward declaration с typedef, который позволяет вам объявить тип, который будет использоваться, но еще не связан с файлом, который вы пишете.

10
ответ дан Yochai Timmer 28 August 2018 в 07:54
поделиться

Как все сказали выше, они не совпадают. Большинство ответов указывают на typedef более выгодным, чем #define. Но позвольте мне добавить плюс #define: когда ваш код очень большой, разбросанный по многим файлам, лучше использовать #define; это помогает в удобочитаемости - вы можете просто предварительно обработать весь код, чтобы увидеть фактическое определение типа переменной в месте самого объявления.

0
ответ дан abcoep 28 August 2018 в 07:54
поделиться

Они очень разные, хотя они часто используются для реализации пользовательских типов данных (именно это я и предполагаю, что этот вопрос есть).

Как упоминалось в PMg, #define обрабатывается pre-processor (как операция вырезания и вставки), прежде чем компилятор увидит код, а typedef интерпретируется компилятором.

Одно из основных отличий (по крайней мере, когда дело доходит до определения типы данных) заключается в том, что typedef допускает более конкретную проверку типов. Например,

#define defType int
typedef int tdType

defType x;
tdType y;

Здесь компилятор видит переменную x как int, но переменную y как тип данных, называемую «tdType», которая имеет тот же размер, что и int. Если вы написали функцию, которая приняла параметр типа defType, вызывающий может передать нормальный int, и компилятор не узнает разницу. Если вместо этой функции вместо параметра tdType был выбран параметр, то компилятор будет гарантировать, что во время вызовов функции использовалась переменная соответствующего типа.

Кроме того, некоторые отладчики имеют возможность обрабатывать typedef s, что может быть гораздо более полезным, чем все пользовательские типы, перечисленные как их базовые примитивные типы (как это было бы, если бы #define использовался вместо этого).

2
ответ дан bta 28 August 2018 в 07:54
поделиться

Нет. typedef - ключевое слово C, которое создает псевдоним для типа. #define - это предпроцессорная инструкция, которая создает событие замены текста перед компиляцией. Когда компилятор попадает в код, исходного слова «#defined» больше не существует. #define в основном используется для макросов и глобальных констант.

1
ответ дан Traveling Tech Guy 28 August 2018 в 07:54
поделиться

AFAIK, No.

'typedef' помогает вам настроить «псевдоним» на существующий тип данных. Напр. typedef char chr;

#define - это директива препроцессора, используемая для определения макросов или общих подстановок шаблонов. Напр. #define MAX 100, заменяет все вхождения MAX со 100

1
ответ дан user 28 August 2018 в 07:54
поделиться
Другие вопросы по тегам:

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