Typedef и #определяют то же самое в c?


интересно, если typedef и #define то же самое в c?

9 102

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 */

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

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

#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

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

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

теперь, говоря это, вот несколько отличий:

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

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

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

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

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

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

Как упоминалось pmg,#define обрабатывается препроцессором (например, операция вырезания и вставки) до того, как компилятор увидит код, и typedef интерпретируется компилятором.

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

#define defType int
typedef int tdType

defType x;
tdType y;

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

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

АФАИК, нет.

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

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

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

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