__builtin_types_compatible_p —
GNU extension to check equivalent types
int
__builtin_types_compatible_p(type_a,
  type_b);
The __builtin_types_compatible_p() is a GNU extension
  for determining whether two types are equivalent. If
  type_a is equivalent to type_b, a
  value 1 is returned. Otherwise
  __builtin_types_compatible_p() returns 0.
The following remarks should be taken into account.
  - The architecture-specific size of the two types does not have an impact on
      the result. For example,
      sizeof(char *) andsizeof(int) result the same
      value on i386, but the types naturally are not equivalent.
- Type qualifiers are ignored. The function returns the same value for
      long and const long.
- The amount of pointer indirection affects the result. For example,
      double * is not equivalent to double
      **.
- Two types defined with typedef are equivalent if and
      only if their underlying types are equivalent.
- The enum type is a special case in that two
      enum types are not considered equivalent.
The following example combines__builtin_types_compatible_p() and the
  typeof(3) construct:
#define __COMPARE_TYPES(v, t)      \
         __builtin_types_compatible_p(__typeof__(v), t)
...
if (__COMPARE_TYPES(p, double) != 0)
	err(EX_DATAERR, "invalid type");
 
This is a non-standard, compiler-specific extension.