WedX - журнал о программировании и компьютерных науках

неявное объявление getchar_unlocked() в C99

Использование getchar_unlocked и компиляция с флагом --std=c99 дает следующее предупреждение:

предупреждение: неявное объявление функции getchar_unlocked [-Wimplicit-function-declaration]

Не выдает никаких предупреждений, если скомпилировано без флага. Есть ли способ обойти это?

c c99
07.07.2016

  • --std=c99 — это строгий режим, вместо него вы можете использовать --std=gnu99. Нет сил пробовать, но кто-то может :-) 07.07.2016
  • @paxdiablo, да, это должно работать, когда кто-то хочет использовать расширение стандарта C, а именно POSIX, не следует ограничивать компилятор голым C99. Еще лучше было бы переключиться на gnu11, который, по-видимому, используется по умолчанию для более новых версий gcc. 07.07.2016

Ответы:


1

Начиная с C99, вы должны иметь видимый прототип функции перед вызовом функции. В то время как более ранний стандарт C просто глупо предполагал, что любая функция, неизвестная компилятору, имеет формат int func (params), что, в свою очередь, в большинстве случаев вызывало серьезные ошибки.

Правильно объявите прототип для getchar_unlocked, и ошибка исчезнет.

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

07.07.2016
  • это не совсем так. Тип прототипа функции существует в stdio.h, но не виден в ['bare'] ansii C. Поскольку функция взята из определений posix, в исходном коде должен быть один из следующих #defined: POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE || _BSD_SOURCE || _SVID_SOURCE --or- - выберите опцию gcc -std=xxx, которая включает функции posix, такие как -std=gnu99 09.07.2016

  • 2

    _unlocked версии get... функций являются расширениями POSIX. Они не являются частью стандартных функций C99. Полный список функций get... приведен в 7.19.1.5: getwc, getwchar, getc, getchar и gets (устаревшие).

    Если функции нет в этом списке, C99-совместимый компилятор должен предупредить вас, что ваша программа не может быть скомпилирована другими C99-совместимыми компиляторами.

    07.07.2016
  • Скорее, соответствующий компилятор не может свободно сбрасывать любую нестандартную чушь в заголовки стандартных библиотек. Они должны следовать соглашениям об именах, они нельзя дать функции имя типа getchar_unlocked и поместить ее в stdio.h. Очевидно, еще один конфликт между стандартным C и нефункциональным стандартом POSIX. 07.07.2016
  • @Lundin, почему это может быть конфликтом? POSIX расширяет стандарт C, вот и все, это ясно сказано. И чтобы использовать его, вы должны сказать компилятору, что вы этого хотите. -std=c99 говорит как раз об обратном, что вам нужен чистый C99 и никаких расширений. 07.07.2016
  • @JensGustedt POSIX должен быть стандартом для API операционной системы. Его не должно беспокоить вмешательство в стандарт языка программирования. Нет причин вызывать нестандартное поведение. Он мог бы также мирно сосуществовать с C, как и любая другая сторонняя библиотека, но нет, это было бы слишком умно... Все сводится к тому, что C и Unix с самого начала сильно переплелись друг с другом, а POSIX возник от *никс. Вместо того, чтобы сделать стандарт, подходящий для любой ОС, они сделали стандарт, в котором говорится, что это делается так, как это делается в Unix. 07.07.2016

  • 3

    Параметры выбора диалекта, такие как -ansi и -std=c99, заставляют компилятор определять определенные макросы (в дополнение к изменению принятого диалекта).

    Заголовочные файлы библиотеки реагируют на эти макросы.

    То, как именно они реагируют, зависит от системы (компилятор не предоставляет библиотеку C), но обычное поведение, которое вы можете ожидать, заключается в том, что если вы используете только один из этих флагов (без какого-либо другого «макроса выбора функций»), он имеет эффект сокрытия объявлений функций, макросов и других глобальных символов, которые не находятся в указанном диалекте ISO C.

    ISO C ничего не знает о getchar_unlocked. Наличие такого объявления в <stdio.h> (обычно в заголовке ISO C) является расширением POSIX, которое в основном не соответствует требованиям, поскольку getchar_unlocked является идентификатором, который могут использовать строго соответствующие программы C, даже если они включают <stdio.h>. Когда вы используете -ansi или -std=c99, заголовок <stdio.h> слушает и преобразует себя в форму, соответствующую ISO-C, скрывая такие расширения.

    В хорошо функционирующих системах POSIX вы можете запросить диалект ISO C и, чтобы некоторые элементарные функции POSIX 1990-х годов были видны в файлах заголовков, например, так:

    gcc -std=c99 -D_POSIX_SOURCE ...
                   ^^^^^ "feature selection macro"
    

    В этих макросах выбора функций есть целая наука, слишком широкая для этого вопроса и ответа; некоторые их формы имеют значения, например -D_XOPEN_SOURCE=500. _POSIX_SOURCE не нуждается в аргументах; это просто определено или нет, но _POSIX_C_SOURCE является числовым.

    Я только что проверил glibc и Cygwin: на обоих _POSIX_SOURCE достаточно, чтобы открыть объявление getchar_unlocked. Он довольно старый, начиная с POSIX.1 1996 года.

    Остерегайтесь: в некоторых системах макросы выбора нескольких функций не работают разумно; они дают вам пересечение набора, а не объединение, так что -D_POSIX_SOURCE и -D_BSD_SOURCE вместе в конечном итоге означают «Объявите мне только те несколько функций, которые характерны для классической BSD, которые также были стандартизированы в POSIX», что означает, что почти ничего не объявлено.

    07.07.2016

    4

    getchar_unlocked не является стандартной функцией C.

    Компиляция принудительного стандарта c99 изначально не поддерживает его.

    07.07.2016
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]