Использование макросов для извлечения информации, которую нам предоставляет оператор typeof (на языке C) - PullRequest
1 голос
/ 10 декабря 2010

У меня есть проблема, которую я не знаю, если есть решение (на языке C) ...

Я хочу объединить макрос с typeof "function", чтобы получить имя типа во время компиляции (поскольку C не использует полиморфизм и другие типы абстракций, которые усложняют задачу для компилятора) .

моя проблема: это кажется невозможным, каждая попытка, которую я делаю, я только получаю, думает как

  • "TypeOf (3)"
  • "TypeOf (\" кошка \ ")"
  • Ошибки компиляции ...

это возможно сделать? Это только для экспериментов, но я думаю, что это может быть интересно использовать во многих кодах.

Заранее спасибо:)

Ответы [ 5 ]

3 голосов
/ 10 декабря 2010

C и C ++ имеют несколько этапов компиляции, а информация, сгенерированная на более позднем этапе, недоступна для более раннего.Подстановка макросов происходит относительно рано и традиционно является частью препроцессора.typeof(), если вы используете систему, которая реализует C с таким расширением, будет применяться к типам литералов или переменных.Эта информация генерируется на более поздней стадии, после того, как анализируется то, что выходит из препроцессора.

Следовательно, у вас не будет typeof() информации, которую можно использовать в макросе, и вам придетсянайти другой способ сделать то, что вы хотели сделать (что-то вроде шаблонов C ++?).

3 голосов
/ 10 декабря 2010

Краткий ответ: не стоит.typeof () является расширением GCC для языка C и не будет переносимым.

Во всяком случае, если вы все еще хотите использовать его, вы не можете делать, как вы описываете.Ответ Дэвида Торнли объясняет, почему.

0 голосов
/ 20 февраля 2013

Посмотрите на оператор __typeof__.

Макрос MINMAX в Си использует его.Стандарт C и Objective-C.

MIN и MAX в C

0 голосов
/ 10 декабря 2010

gcc имеет gcc typeof keyword.Используя это, вы больше не компилируете C, а что-то другое, похожее на C, но не совсем C.

Используйте на свой страх и риск.

0 голосов
/ 10 декабря 2010

Полагаю, вы говорите о typeof -конструктивном расширении GCC для C.

К сожалению, я не думаю, что это поможет вам в том, что вы пытаетесь сделать - это не оператор,он не оценивается до некоторого значения.

Он может использоваться только в определенных сценариях и (насколько я знаю) не имеет никакого отношения к препроцессору:

Typeof-конструкция может использоваться везде, где можно использовать имя typedef

...