В чем разница между использованием имени функции и псевдонима (сделанного из typedef) при объявлении другой функции? - PullRequest
0 голосов
/ 29 октября 2019

когда я использую имя из typedef, было так много ошибок. Но после того, как я изменил имя на оригинальное имя, это работает. Я хочу знать, что отличается между ними.

void SwapPoint(Point *pos1, Point *pos2);
//errors

void SwapPoint(struct point *pos1, struct point *pos2);
//it works


void SwapPoint(Point *pos1, Point *pos2);
typedef struct point
{
    int xpos;
    int ypos;
}Point;

void SwapPoint(Point *pos1, Point *pos2)
{
    Point temp;
    temp = *pos1;
    *pos1 = *pos2;
    *pos2 = temp;
}


there's no ')' in front of '*'
there's no '{' in front of '*'
there's no ';' in front of '*'

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Оба объявления функций:

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 перед обоими объявлениями функции.

2 голосов
/ 29 октября 2019

Объявление SwapPoint появляется перед typedef для Point, поэтому имя еще не известно.

Переместите объявление после typedef:

typedef struct point
{
    int xpos;
    int ypos;
}Point;

void SwapPoint(Point *pos1, Point *pos2);
...