tipos tipo sanguineos sangre que origen negativo grupo compatibles compatibilidad c types autoconf

sanguineos - Causa error de compilación en C89 si dos tipos no son iguales



tipos de sangre y compatibilidad (2)

Creo que debería poder utilizar la comprobación de tipos estricta de las declaraciones extern :

typedef int T1; typedef char T2; extern T1 t1; T2 t1;

Lo anterior no se compilará. Cambiar T2 a un int permitirá que la fuente se compile correctamente.

Esto tampoco se compilará:

typedef int T1; typedef unsigned int T2; extern T1 t1; T2 t1;

Aunque ambos tipos son int . Que creo que es lo que quieres.

Sin embargo, esto no activará un error:

typedef emum {Foo} T1; typedef unsigned T2;

Así que no es 100% impermeable. Sin embargo, hay que tener en cuenta que no se puede hacer nada con una enum que tampoco se puede hacer con una unsigned . Tienen el mismo diseño y se pueden usar indistintamente. Efectivamente, son del mismo tipo.

Usando solo las características del C89, dadas

typedef [unspecified token sequence] T1; typedef [another unspecified token sequence] T2;

exhibe un constructo de lenguaje que se compilará sin error si y solo si T1 y T2 son del mismo tipo (no solo compatibles). La limitación de C89 se debe a que esto va a entrar en una sonda autoconf.

EDITAR: Necesito una solución que funcione incluso si T1 o T2 o ambos son tipos incompletos. Lo siento por no mencionar esto antes.

SON OF EDIT: Las tres respuestas actuales solo detectan tipos compatibles . Esto resulta ser mucho más cercano a "el mismo tipo" de lo que recordaba, lo suficientemente cerca para mis propósitos actuales, pero por curiosidad todavía estoy buscando una respuesta que detecte el mismo tipo. Aquí hay algunos pares de tipos que son compatibles pero no iguales:

typedef void (*T1)(void); typedef void (*T2)(); typedef float T1[]; typedef float T2[12]; typedef enum { ONE, TWO, THREE } T1; typedef /* implementation-defined integer type */ T2;


T1 t1; T2 *t2 = &t1;

Esta es una violación de restricción si T1 y T2 no son lo mismo.

O,

T1 f(); T2 f() {}