Оба объявления функций:
void SwapPoint(Point *pos1, Point *pos2);
//errors
void SwapPoint(struct point *pos1, struct point *pos2);
//it works
, даже если вы написали, что «это работает» для второго объявления функции, недопустимы в C. Обратите внимание на то, что компилятор visual-studio имеет множество ошибок и егорасширения собственного языка, которые не соответствуют стандарту C.
Первое объявление недопустимо, поскольку имя Point
еще не определено.
Второе объявление функции недопустимо, поскольку тип struct point
невидим вне объявления функции и не обозначает тип, который был определен ниже объявления функции. То есть тип параметра не совпадает с этим объявлением структуры
typedef struct point
{
int xpos;
int ypos;
}Point;
Из стандарта C (6.2.1 Области идентификаторов)
... Если декларатор или спецификатор типа, который объявляет идентификатор, появляется в списке объявлений параметров в прототипе функции (не является частью определения функции), идентификатор имеет область действия прототипа функции, которая заканчивается в концеобъявление функции.
Поэтому поместите typedef перед обоими объявлениями функции.