Подтвердить что ты не робот

Причина ошибки компиляции в 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;
4b9b3361

Ответ 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() {}