Я пытаюсь создать тестовую программу, которая просто ищет любой файл в своей корневой папке:
#include <stdio.h>
#include <dir.h>
#include <dos.h>
struct ffblk ffblk;
int main(){
int result = findfirst("*.*", &ffblk,FA_ARCH);
return 0;
}
Но когда код компилируется, объявление ffblk
struct
возвращает ошибку:
storage size of ffblk isn't known
и функция findfirst()
возвращает:
warning: implicit declaration of function 'findfirst'[-Wimplicit-function-declaration]
как видно на этом изображении, хотя и findfirst
, и ffblk
являются членами уже включенного dir.h
. Я использую Visual Studio
и компилирую с GCC
. Кто-нибудь знает, что не так с кодом или заголовочными файлами?
да. По-прежнему считается, что findfirst () объявлен неявно, и размер хранилища структуры все еще неизвестен, единственное, что изменяется, - это имя.
Вы хотите посмотреть, сможете ли вы использовать заголовки из этого века :(
Вы действительно, действительно не должны использовать устаревшие API из устаревших заголовков, таких как «dos.h», если вы вообще можете избежать этого. Честный!
Тем не менее, если вы настаивать ...
Как указал dbush, фактический (устаревший!) API - это _findfirst
(не findfirst
).
Это задокументировано здесь
Вы увидите, что аргументом для этого (опять же - УСТАРЕВШИЙ) API является struct _finddata_t *fileinfo
(не struct ffblk
).
Измените свой код, и все должно скомпилироваться и запуститься.
Лучше поменяйте заголовки (на «io.h» и «dir.h») - и исходный код, вероятно, должен скомпилироваться и запуститься.
Спасибо! Я следил за примером кода из сообщения 2014 года, который копировал себя в другие файлы в папке, и он использовал и dos.h, и dir.h, и findfirst () вместо _findfirst (). Я не думал, что заголовок В самом деле станет устаревшим для такого старого языка, как C.
Платформы (вроде "дос") приходят и уходят - C - это навсегда :)
В: Думали ли вы о том, что нужно делать в предупреждениях?
<dos.h> is obsolete: consider using <direct.h> instead.
и<dir.h> is obsolete, consider using <io.h> instead.
. ПРЕДЛОЖЕНИЯ: 1) Попробуйте заменить «io.h» и «direct.h», 2) подумайте об использованииstruct ffblk f;
.