sys / stat.h: 456: ошибка: вложенная функция stat объявлена ​​как extern - PullRequest
0 голосов
/ 18 января 2019

У меня есть программа, которую я сделал, модифицируя многие места из оригинального даркнета (глубокое распознавание образов, Yolov2). Я использовал его несколько месяцев назад, но сегодня, когда я его скомпилировал, он выдал ошибку ниже:

gcc  -DSAVE_LAYER_INPUTS -DSAVE_INPUTS_LAYER_START=31 -DSAVE_INPUTS_LAYER_END=31 -DPRINT_INOUT -Wall -Wfatal-errors  -O3 -ffast-math -c ./src/convolutional_layer.c -o obj/convolutional_layer.o
In file included from ./src/convolutional_layer.c:463:
/usr/include/sys/stat.h: In function 'forward_convolutional_layer':
/usr/include/sys/stat.h:456: error: nested function 'stat' declared 'extern'

Я использовал stat.h, чтобы проверить, существует ли каталог, а если нет, чтобы его создать. Эта ошибка возникает в строке #include и внутри файла stat.h. Я посмотрел в stat.h, но не могу сказать, что не так. stat.h выглядит следующим образом (я показал, какая из них является строкой 456.)

#if defined __GNUC__ && __GNUC__ >= 2 && defined __USE_EXTERN_INLINES
/* Inlined versions of the real stat and mknod functions.  */

__extern_inline int
__NTH (stat (__const char *__path, struct stat *__statbuf))
{     // <=== line 456
  return __xstat (_STAT_VER, __path, __statbuf);
}

__NTH просто добавляет атрибут о броске. В чем проблема? (с использованием gcc 4.4.7 на CentOS 6.9)

1 Ответ

0 голосов
/ 20 января 2019

Как правило, системные заголовки должны быть включены вне каких-либо функций в вашем коде. Стандарт C11 гласит: §7.1.2 Стандартные заголовки (выделение добавлено):

¶4 Стандартные заголовки могут быть включены в любом порядке; каждый из них может быть включен более одного раза в заданную область, без эффекта, отличного от того, который включается только один раз, за ​​исключением того, что эффект от включения <assert.h> зависит от определения NDEBUG (см. §7.2). Если используется, заголовок должен быть включен вне любого внешнего объявления или определения, , и он должен быть сначала включен перед первой ссылкой на любую из функций или объектов, которые он объявляет, или на любой из типов или макросов. это определяет. Однако, если идентификатор объявлен или определен в более чем одном заголовке, второй и последующие ассоциированные заголовки могут быть включены после начальной ссылки на идентификатор. В программе не должно быть макросов с именами, лексически идентичными ключевым словам, определенным в настоящее время до включения заголовка или при раскрытии любого макроса, определенного в заголовке.

Я не нашел эквивалентной формулировки в POSIX, но вы должны предположить, что применяются аналогичные правила.

Учитывая сообщение об ошибке с упоминанием «вложенных функций», вполне вероятно, что вы пытаетесь включить #include <sys/stat.h> изнутри области действия одной из ваших функций, и, учитывая, что заголовок определяет некоторые встроенные функции, вы случайно пытаетесь определить их как вложенные функции, что в общем случае недопустимо (хотя GCC имеет некоторую поддержку для вложенных функций, но вы, вероятно, должны рассматривать это как непереносимое).

...