Причина ошибки компиляции в C89, если два типа не совпадают
Используя только функции C89, данные
typedef [unspecified token sequence] T1;
typedef [another unspecified token sequence] T2;
демонстрирует конструкцию языка, которая будет компилироваться без ошибок тогда и только тогда, когда T1 и T2 будут одного типа (а не только совместимы). Ограничение на C89 связано с тем, что оно входит в зонд autoconf.
EDIT: Мне нужно решение, которое работает, даже если T1 или T2 или оба являются неполными. Извините, что не упоминал об этом раньше.
SON OF EDIT: Все три текущих ответа обнаруживают только совместимые типы. Это оказывается намного ближе к "тому же типу", чем я помнил, достаточно близко для моих текущих целей, но из любопытства я все еще ищу ответ, который определяет тот же тип. Вот несколько типов совместимых типов, но не одинаковые:
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;
Ответы
Ответ 1
Я думаю, вы сможете использовать строгую проверку типов объявлений extern
:
typedef int T1;
typedef char T2;
extern T1 t1;
T2 t1;
Вышеуказанное не будет компилироваться. Изменение T2 на int
позволит правильному построению источника.
Это также не скомпилируется:
typedef int T1;
typedef unsigned int T2;
extern T1 t1;
T2 t1;
Хотя оба типа int
. Я думаю, это то, что вы хотите.
Однако это не вызовет ошибки:
typedef emum {Foo} T1;
typedef unsigned T2;
Так что это не 100% водонепроницаемость. Однако следует иметь в виду, что с enum
ничего нельзя сделать, что также невозможно сделать с помощью unsigned
. Они имеют одинаковую компоновку и могут использоваться взаимозаменяемо. Фактически, они одного типа.
Ответ 2
T1 t1;
T2 *t2 = &t1;
Это нарушение ограничения, если T1 и T2 не совпадают.
Или
T1 f();
T2 f() {}