что такое typeof ((c) + 1) в C - PullRequest
       25

что такое typeof ((c) + 1) в C

43 голосов
/ 14 декабря 2010

Я сталкивался с выражением на С, как

typeof((c) + 1) _tmp = c;

Что именно это значит?

Спасибо за ответ.

Только одно сомнение? Что если тип c будет struct вместо примитивных типов, то что будет делать +1?

Ответы [ 7 ]

56 голосов
/ 14 декабря 2010

Оператор typeof в простом C (не C ++) является дополнением GCC к стандарту.Он сообщает компилятору, что вы хотите использовать тип выражения, заключенный в круглые скобки.

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

Операция + внутри typeof имеет своеобразный эффект.typeof((c) + 1) означает "тип c или тип 1, какой бы ни оставался после повышения" .Помните, что, например, символы преобразуются в целые, когда они используются в операциях, в которых используются целые числа, целые числа преобразуются в числа с плавающей запятой, числа с плавающей запятой в двойные числа и т. Д.* будет переведен в int для выполнения операции.

Обратите внимание, что это может решить только компилятор: typeof не оценивает, не имеет значения, во время выполнения ничего не происходит.

Полное описание typeof можно найти здесь .

5 голосов
/ 14 декабря 2010

создать переменную _tmp st _tmp типа upcast (max) c или int и установить для него значение c.

например,

char c -> int _tmp // char(c) + 1 is int
float c -> float _tmp // float(c) + 1 is float
4 голосов
/ 30 мая 2013

Сравните код,

typeof((c) + 1) _tmp = c;

с

typeof(c) _tmp = c;

typeof допускает аргументы типов или переменных. Теперь рассмотрим c как

  • struct { int a; int b }
  • указатель на struct { int a; int b }
  • фактический текст int.

Помимо , продвигающего char согласно uʍop ǝpısdn , макрос защищает от присвоения struct. Поэтому следующий код не скомпилируется,

struct { int a; int b } c;
typeof((c)+1) _tmp = c;

Люди могут захотеть запретить struct назначения по соображениям эффективности и размера кода, особенно с помощью универсального макроса.

4 голосов
/ 14 декабря 2010

В дополнение к другому ответу, + здесь довольно тонкий.Это позволяет c быть либо выражением, либо типом.

  • Если это выражение, то, как сказано, c повышается до int (как минимум), а тип целого выражения имеет по крайней мере целочисленный ранг int.
  • Если это выражение типа, то круглые скобки, окружающие c, приводят к приведению значения +1.Таким образом, результирующий тип будет просто c.

Для обоих видов акробатики важно, чтобы c был арифметического типа, и также следует отметить, что этот трюк может потерять подписьc.Так что использование расширения typeof не так полезно, как может показаться.В большинстве случаев достаточно использовать uintmax_t или intmax_t.

4 голосов
/ 14 декабря 2010

Это не стандартный C. В C нет такой вещи, как typeof (если только вы не имеете дело с чем-то определенным пользователем).

typeof обычно является расширением компилятора (скорее всего, компилятором GCC).Вы можете прочитать об этом здесь

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

1 голос
/ 14 июня 2013

По моему мнению, только для указателя, typeof((c) + 1) = typeof(c);, так что это может гарантировать, что передаваемый параметр - указатель

1 голос
/ 14 декабря 2010

Typeof возвращает тип и вычисляется во время компиляции.

Весь оператор означает объявление переменной tmp того же типа, что и c (обычно).

Он может объявлять связанный или другой тип, поскольку тип c + 1 может отличаться от c. (это более вероятно в C ++).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...