- Разрешить все предупреждения компилятора.
- Компилировать со всеми включенными предупреждениями компилятора
-Wall -Wextra
.
- Разрешить все предупреждения компилятора.
- В коде, который вы разместили, отсутствует
#endif
, возможно, от #ifdef HAVE_DIRENT_H
, но я предполагаю, что последняя строка file_utils.h
должна быть закрывающей #endif
.
- Предупреждение, которое я получаю от gcc, таково:
предупреждение: "struct direct" объявлено внутри списка параметров
предупреждение: его область действия - только это определение или декларация, что, вероятно, не то, что вам нужно
Это самое важное предупреждение.
Определение структуры действительно только внутри списка параметров функции. Пример:
void other_f(
struct B a // this will forward declare struct B
// scope of this variable is _only_ inside function parameter list
); // here struct B get's out of scope!
struct B b; // will error, there is no struct B here
// struct B was declared inside function parameter list
// you can't use it anywhere else
MCVE к вашей проблеме будет следующим примером:
void f(struct A);
struct A;
void f(struct A); // error conflicting types for 'f'
struct A
будет объявлено (я называю это "автоматически объявленным") в списке параметров функции void f( <here> )
при первом использовании. Объявление структуры будет видно только внутри списка параметров. Так что это похоже на псевдокод:
{
struct A; // type only valid inside `{` `}` braces
void f(struct A a); // imagine this symbol is visible outside `{` `}`
}
т. struct A
не виден за пределами {
}
.
Затем вы объявляете еще один struct A
:
struct A;
void f(struct A a);
Но этот struct A
отличается от других struct A
. В отличие от struct A
, функция f
отличается, компилятор выдает ошибку.
Не считайте ваш заголовок:
#define dirent direct
...
bool is_relative_path(struct dirent *ent);
Я не знаю, является ли direct
опечаткой или нет. Но вам нужно объявить вперед struct direct
, чтобы прямое объявление struct direct было видно вне списка параметров функции is_relative_path
.
struct direct;
#define dirent direct
...
// or here:
struct dirent;
bool is_relative_path(struct dirent *ent);