Как разделить функции между файлами .h и. c - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь разделить свои прототипы функций и фактические реализации между файлами .h и. c, чтобы было легче увидеть, какие функции у меня есть.

мой компилятор, Visual Studio, удалил фигурное зеленое подчеркивание из-под прототипов функций в файлах заголовков, подразумевающее, что он видит реализации в файле. c, но когда я пытаюсь его скомпилировать, я получаю более 100 ошибок, в которых говорится что-то вроде «syntax error: missing ';' before '*'» или «syntax error: missing ')' before '*' "или" syntax error: missing '}' before '*' "в файлах .h и. c. В основном они указывают на параметры в прототипах, но я не мог go точно знать все.

Есть ли какой-нибудь другой способ сделать это?

Я пробовал:

  • Делаем их внешними
  • Смена охранников на имя, которое я точно знаю, еще не использовалась

Я не знаю, что еще я могу попробовать.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Первая вещь, которую вы могли бы попробовать, это опубликовать свой код, чтобы мы могли его увидеть: -)

Однако ошибка syntax error: missing ';' before ... почти всегда появляется потому что у вас неизвестный тип, согласно следующему:

int main() {
    NOTYPE *x;
    return 0;
}

Поскольку вы перемещаете прототипы функций в заголовок, может быть, что они используют типы, которые все еще существуют в файле C. Эти объявления типов должны существовать перед использованием, иначе вы получите эту ошибку.

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

Согласно другой информации, размещенной здесь, вы также можете получить эту проблему с циклическими зависимостями, например:

typedef struct { TWO *two; } ONE; // don't know anything about TWO here.
typedef struct { ONE *one; } TWO;

Если бы зависимость была только один , тогда вы могли бы просто убедитесь, что порядок двух определений был правильным. С зависимостью круговой вы должны ввести неполное определение (на самом деле декларацию), чтобы она работала:

typedef struct TWO;                // declare that TWO exists.
typedef struct { TWO *two; } ONE;  // define ONE, we know TWO exists.
typedef struct { ONE *one; } TWO;  // define ONE, we know all about ONE.

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

typedef struct TWO;
typedef struct { TWO two; } ONE;

, потому что для определения ONE требуется полный тип.

0 голосов
/ 11 июля 2020

Я обнаружил ошибку.

Проблема заключалась в том, что у меня была круговая зависимость с двумя структурами, и я попытался исправить ее, определив их обе перед их реализацией, но это явно не сработало.

это был мой код:

typedef struct A;
typedef struct B;

typedef struct {
    B* blist;
}A;

typedef struct {
    A* a_parent;
}B;

Следующий ответ stackoverflow помог мне исправить мои ошибки:

Разрешить циклическую зависимость typedef?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...