compiler compilador c gcc

compilador - qué es typeof((c)+1) en C



gcc wikipedia (7)

Encontré una expresión en C como

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

¿Qué significa esto exactamente?

Gracias por la respuesta.

Solo una duda? ¿Qué pasa si el tipo de c es struct en lugar de los tipos primitivos, entonces, qué hará +1?


Además de la otra respuesta, el + aquí es bastante sutil. Permite que c sea ​​una expresión o un tipo.

  • Si es una expresión, entonces, como se dijo, c se promueve a int (al menos) y el tipo de la expresión completa tiene al menos un rango entero de int .
  • Si es una expresión de tipo, el paréntesis que rodea a c convierte en un molde del valor +1 . Entonces el tipo resultante es solo c .

Para ambos tipos de acrobacia es importante que c sea ​​de tipo aritmético y también es importante notar que este truco aquí podría perder la firma de c . Por lo tanto, este uso del tipo de extensión no es tan útil como podría parecer. En la mayoría de los casos, usar uintmax_t o intmax_t sería suficiente.


Compare el código,

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

con

typeof(c) _tmp = c;

typeof permite argumentos de tipos o variables. Ahora considere c como,

  • struct { int a; int b }
  • un puntero a struct { int a; int b } struct { int a; int b }
  • el texto real int .

Además de promover char según uʍop ǝpısdn , la macro protege contra una asignación de struct . Entonces el siguiente código no compilará

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

Las personas pueden desear prohibir las asignaciones de struct por razones de eficiencia y tamaño de código, especialmente con -en una macro genérica.


El operador typeof en C simple (no C ++) es una adición de GCC al estándar. Le dice al compilador que desea utilizar el tipo de expresión entre paréntesis.

Usando typeof como se typeof arriba, puede declarar variables de tipos desconocidos para usted o en ese contexto, usando el tipo de otra variable como referencia. También se puede usar para lanzar.

La operación + dentro de typeof tiene un efecto peculiar. typeof((c) + 1) significa "el tipo de c, o el tipo de 1, lo que quede después de la promoción" . Recuerde que, por ejemplo, los caracteres se promocionan a ints cuando se usan en operaciones que involucran a ints, los ints se promueven en flotantes, flotantes en dobles, etc.

Entonces, typeof(int_variable + char_variable) es int , ya que el char sería promovido a int para realizar la operación.

Tenga en cuenta que solo el compilador puede resolver esto: typeof no evalúa, no tiene ningún valor, no ocurre nada en el tiempo de ejecución.

La descripción completa de typeof se puede gcc.gnu.org/onlinedocs/gcc/Typeof.html .


En mi opinión, solo para puntero, typeof((c) + 1) = typeof(c); así que esto tal vez asegure que el parámetro que pasa es puntero


No es estándar C. C no tiene tal cosa como typeof (a menos que se trate de algo definido por el usuario).

typeof es normalmente una extensión del compilador (el compilador GCC es más probable). Usted puede leer sobre ello aquí

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


Typeof devuelve un tipo y se evalúa en tiempo de compilación.

Toda la declaración significa declarar una variable tmp con el mismo tipo que c (generalmente).

Podría declarar un tipo relacionado o diferente, ya que el tipo de c + 1 puede ser diferente de c. (esto es más probable en c ++).


create var _tmp st _tmp es de tipo upcast (max) de c o int y lo establece en el valor de c .

p.ej

char c -> int _tmp // char(c) + 1 is int float c -> float _tmp // float(c) + 1 is float