Объявления функций и структуры в C - PullRequest
2 голосов
/ 22 февраля 2011
int f(struct r);
struct r
{
int a;
int b;
};

Приведенный выше фрагмент в исходном файле выдает ошибку,

warning: its scope is only this definition or declaration,
which is probably not what you want for the line int f(struct r) 

и следующий фрагмент где-то в том же исходном файле, но до определения функции f(struct r)

struct r emp;
f(emp);

выдает ошибку

error:type of formal parameter 1 is incomplete for the line f(emp)

но то же самое, когда структура заменяется на typedef, таких ошибок не было ...

Является ли это свойство для объявления аргумента в объявлении функции перед его использованием, специфичным только для структуры?

1 Ответ

5 голосов
/ 22 февраля 2011

Попробуйте другой заказ:

struct r { int a; int b; };
int f(struct r);

Если вам нужно, чтобы функция была объявлена ​​перед структурой, используйте предварительное объявление:

struct r;
int f(struct r);
...
struct r { int a; int b; };
int f(struct r anR)
{
    return anR.a + anR.b;
}

Проблема в том, что во время компиляции int f(struct r); компилятор не видит вашу структуру, поэтому вместо этого он создает некоторую временную структуру. Ваше объявление структуры позже с точки зрения компилятора не связано с временной.

...