ЬурейеЕ, # определить - PullRequest
2 голосов
/ 23 июля 2010

Кто-нибудь может объяснить разницу между

#define int* char

и

typedef int* char;

Ответы [ 7 ]

5 голосов
/ 23 июля 2010

Нет никакой разницы, потому что оба незаконны.

int* не является допустимым идентификатором макроса, и даже если вы вставите пробел, он также не будет int, потому что это ключевое слово и зарезервировано. Даже если вы переключили его на вероятное значение #define char int*, по той же причине произойдет сбой.

И вы не можете переопределить тип char, поэтому typedef - это перебор.


Разница, если бы вы приводили примеры, которые были законными, заключается в том, что #define является директивой предварительной обработки. Это делает только текстовую замену, перед этапом компиляции. Наоборот, typedef определяет новый тип, и этот новый идентификатор типа уважает «правила», как и любой другой тип.

2 голосов
/ 23 июля 2010

Они разные.Проверьте ТАК вопрос .

#define - это замена, которая обрабатывается во время предварительной обработки

typedef используется для определения нового типа, который игнорируется во время предварительной обработки

2 голосов
/ 23 июля 2010

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

Typedef обрабатывается самим компилятором c и является фактическим определениемНовый тип.

1 голос
/ 23 июля 2010

#define является директивой препроцессора. Перед компиляцией текст int* будет изменен на char. Это то, что вы обычно не делаете.

Typedef - языковая инструкция. Он определяет новый тип, как только что сказал Forlan07 .

Ваш пример очень плох в любой форме. К счастью, это незаконно, как отмечал GMan .

0 голосов
/ 23 июля 2010

Псевдоним типа, определенный с использованием макроса, а не typedef, может быть неопределенным или переопределенным, в то время как typedef - нет.Вот почему вы можете увидеть псевдонимы типов, определенные таким образом.Это одновременно и слабость, и преимущество.Количество библиотек C, которые определяют свои собственные типы с общими именами, например, UINT, DWORD или BOOL, неисчислимо и является причиной многих проблем при использовании нескольких сторонних библиотек.По крайней мере, с помощью макроса вы можете заставить их быть неопределенными или проверить существующие определения;если используется typedef, у вас может возникнуть проблема столкновения символов, что затрудняет интеграцию такого кода.

В C ++ проблему лучше решить, инкапсулировав сторонний код в пространство имен, тогда typedef останется лучшим решением для псевдонимов типов.

0 голосов
/ 23 июля 2010

typedef назначает альтернативные имена существующим типам. например: typedef без знака long size_t

Теперь в коде вы можете заменить unsigned long на size_t неподписанный длинный темп; такой же, как size_t temp;

'# define' - это директива препроцессора. Это заставляет компилятор проходить исходный код, заменяя каждое вхождение имени макроса строкой замены например #define PI 3.14159

Выбранные вами примеры приведут к ошибке компиляции.

0 голосов
/ 23 июля 2010

[typdef] позволяет вводить синонимы для типов, которые могли бы быть объявлены другим способом. Новое имя становится эквивалентным требуемому типу, как показано в этом примере.

define - это макрос c препроцессора , который просто заменит в вашем коде вхождения.

Конкретный пример, который вы показываете, кажется мне немного странным. Может быть, вы можете добавить некоторую справочную информацию к вашему вопросу.

...