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 aint
(al menos) y el tipo de la expresión completa tiene al menos un rango entero deint
. - 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 soloc
.
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í
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