Ошибка 'exit' was not declared in this scope"

Ошибка 'exit' was not declared in this scope"

23.01.2018 02:23:17 Просмотров 32 Источник

Программа, которая выдает размер директории. Выдает ошибку в строчке exit (1). " 'exit' was not declared in this scope". В чем может быть ошибка?

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>

main()
{
  DIR *d;
  struct dirent *de;
  struct stat buf;
  int exists;
  int total_size;

  d = opendir(".");
  if (d == NULL) {
    perror("prsize");
    exit(1); // **ОШИБКА**
  }

  total_size = 0;

  for (de = readdir(d); de != NULL; de = readdir(d)) {
    exists = stat(de->d_name, &buf);
    if (exists < 0) {
      fprintf(stderr, "Couldn't stat %s\n", de->d_name);
    } else {
      total_size += buf.st_size;
    }
  }
  closedir(d);
  printf("%d\n", total_size);
}
У вопроса есть решение - Посмотреть?

Ответы - Ошибка &#39;exit&#39; was not declared in this scope&quot; / Ошибка 'exit' was not declared in this scope"

Владимир Мартьянов

Добавьте #include <stdlib.h>

Ошибка в том, что вы не пытаетесь посмотреть в каком заголовочном файле объявлена проблемная функция. Гугл в данном случае дает ответ быстрее, чем вы задаете вопрос.

Является ответом!
Sergey

24.01.2018 04:51:19

Насчёт гугла я не стал бы рекомендовать. За то, что там выдаст гугл - не отвечает никто. Но есть официальный источник информации - man система.

По первому вопросу. Смотрим man 3 exit. Там в третьей строке написано:

#include <stdlib.h>

И не надо ни у какого гугла спрашивать - там, зачастую,содержатся совершенно противоречивые советы. Подсказка: в команде man второй парамерт означает:

  1. Команда Shell
  2. Системный вызов (обращение к ядру ОС)
  3. Вызов функции из стандартной библиотеки.

По второму вопросу: "что вернёт stat() на каталог?". С точки зрения ФС наиболее распространённых типов (EXT3, EXT4), каталог - это самый обычный файл, в котором содержатся записи определённой структуры. Что бы понять, как отличить регулярный файл от каталога, опять таки смотрим man 2 stat. Там даже пример приведён:

stat(pathname, &sb);
if ((sb.st_mode & S_IFMT) == S_IFREG) {
     /* Handle regular file */
}

Ну и третий вопрос - про '.' и '..'. С точки зрения ФС это просто обозначения (синонимы) для реальных каталогов - текущего и родительского. Поэтому их обработка ничем не отличается от обработки каталогов, заданных явно.

Помочь в развитии проекта:
Закрыть X