int
- это примитивный тип: независимо от того, где вы его используете, он всегда будет ссылаться на точно одно и то же - int
.
struct{int a;}
не является примитивным типом - каждый раз, когда вы определяете struct{int a;}
, вы создаете новый тип - следовательно, почему s1
и s2
считаются различными в вашем случае Программы 2.
Например, рассмотрим следующее:
typedef struct{int count;} apples;
typedef struct{int count;} airplanes;
Яблоки и самолеты - это одно и то же? Возможно нет. Но их количество является числовым. Следовательно, почему int
является последовательным, а structs
нет - int
не имеет никакого контекста, связанного с ним, структуры делают.
typedef
на самом деле не создает никаких новых типов - он только псевдоним типа под другим именем.
Следовательно, разница между Программой 1 и Программой 2 состоит в том, что в Программе 1 вы пытаетесь определить две версии функции с (с точки зрения компилятора) абсолютно одинаковой подписью: print(int)
. В программе 2 вы определяете две разные подписи: print([first struct type])
и print([second struct type])
.