sys / stat.h: 456: ошибка: вложенная функция stat объявлена ​​как extern

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

Для PCRE и большинства других так называемых Perl-совместимых ароматов избегайте этих внешних классы символов:

.^$*+?()[{\|

и эти внутренние классы символов:

^-]\

Для POSIX расширенных регулярных выражений (ERE), избегайте этих внешних классов символов (таких же, как PCRE):

.^$*+?()[{\|

Выключение любых других символов является ошибкой с POSIX ERE.

Внутри классов символов обратная косая черта является буквальным символом в регулярных выражениях POSIX. Вы не можете использовать его, чтобы избежать чего-либо. Вы должны использовать «умное размещение», если хотите включить метасимволы класса символов в виде литералов. Поместите ^ в любом месте, кроме как в начале, в начале, а в начале или в конце класса символов, чтобы соответствовать этим буквально, например:

[]^-]

В основных регулярных выражениях POSIX (BRE), это метасимволы, которые вам нужно убежать, чтобы подавить их смысл:

.^$*

Выпуски из круглых скобок и фигурных скобок в BRE дают им особый смысл, который их неописуемые версии имеют в ERE. Некоторые реализации (например, GNU) также придают особое значение другим символам при экранировании, например \? и +. Сброс символа, отличного от. ^ $ * () {}, Как правило, является ошибкой с BRE.

Внутри классов символов BRE следуют тому же правилу, что и ERE.

Если все это делает голова спина, возьмите копию RegexBuddy . На вкладке «Создать» нажмите «Вставить маркер», а затем «Литерал». RegexBuddy добавит экраны при необходимости.

-1
задан Chan Kim 18 January 2019 в 07:54
поделиться

1 ответ

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

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

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

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

0
ответ дан Jonathan Leffler 18 January 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: