Arhn - архитектура программирования

strcmpi переименован в _strcmpi?

В MSVC++ есть функция strcmpi для случая -нечувствительные сравнения C-строки.

Когда вы пытаетесь использовать его, он идет,

This POSIX function is deprecated beginning in Visual C++ 2005. Use the ISO C++ conformant _stricmp instead.

Чего я не понимаю, так это почему ISO не хочет, чтобы MSVC++ использовала strcmpi, и почему _stricmp предпочтительнее, и зачем им переименовывать функцию, и как функция, начинающаяся с символа подчеркивания, совместима с ISO. Я знаю, что для всего этого должна быть причина, и я подозреваю, что это потому, что strcmpi нестандартен, и, возможно, ISO хочет, чтобы нестандартные расширения начинались с _underscore?

27.12.2009

Ответы:


1

ISO C резервирует определенные идентификаторы для будущего расширения (см. Зарезервированные имена Oracle Solaris Studio 12.3: C User's Guide">здесь), включая все имена, начинающиеся с "str".

27.12.2009

2

ИМНШО, это способ Microsoft сказать: «Не устанавливайте программное обеспечение Unix на машины с Windows». У проблемы есть несколько неприятных аспектов:

  1. strcmpi() не является функцией POSIX — соответствующие функции определены в <strings.h> и называются strcasecmp() и т.д.
  2. Даже если вы явно запрашиваете поддержку функций POSIX, Microsoft считает, что вы не можете использовать имена POSIX, но должны ставить перед ними жалкое подчеркивание.
  3. Насколько я знаю, нет способа переопределить взгляд компилятора MSVC на эту проблему.

Тем не менее, цепочка инструментов GCC немного сдержанна в отношении некоторых функций — mktemp() и др. Однако он успешно компилируется и компонуется, несмотря на предупреждения (которые оправданы).

Я отмечаю, что у MSVC тоже есть сомнения по поводу snprintf() и др. Если бы их функция соответствовала стандарту C99 (наряду с остальной частью компилятора), то не было бы никакого риска переполнения — стандарт требует нулевого завершения, вопреки утверждениям Microsoft.

У меня нет действительно хорошего решения этой проблемы - я не уверен, что оно есть. Одна из возможностей состоит в том, чтобы создать заголовок (или набор заголовков), чтобы сопоставить все фактические имена POSIX с их неверным истолкованием Microsoft. Второй — создать библиотеку тривиальных функций с правильным именем POSIX, каждая из которых вызывает версию имени Microsoft (предоставляя вам массивный набор четырехстрочных функций — строка декларатора, открывающая фигурная скобка, закрывающая фигурная скобка и оператор возврата, который вызывает вариант Microsoft имени функции POSIX.

Забавно, что вызовы Microsoft API, которые также загрязняют пространство имен пользователя, не устаревают и не переименовываются.

27.12.2009
  • Хорошо сказано! Также раздражает то, что MSVC настаивает на выдаче предупреждений о небезопасных библиотечных функциях и на том, что вместо них следует использовать варианты *_s. 27.12.2009
  • Обратите внимание, что Visual Studio 2015 теперь имеет версии vsnprintf() и др., которые соответствуют как минимум C99, а также (обратно совместимые и неизмененные) версии _vsnprintf(). 27.02.2016

  • 3

    Имена, начинающиеся со знака подчеркивания и строчной буквы, зарезервированы стандартом C++ для реализации C++, если они объявлены в глобальном пространстве имен. Это предотвращает их конфликты с похожими именами в вашем собственном коде, который не должен использовать это соглашение об именах.

    27.12.2009

    4

    strcmpi полностью исчезает в Visual C++ 2008, поэтому вам определенно следует обратить внимание на устаревание, если вы когда-либо намереваетесь выполнить обновление.

    _ не делает функцию стандартом ISO, просто функции, начинающиеся с _, безопаснее добавлять по мере развития языка, потому что это одна из частей пространства имен, зарезервированных для использования языком.

    Согласно документации Microsoft для _stricmp, это звучит например, strcmpi имеет некоторые практики, которые приводят к некоторым неинтуитивным порядкам (включая нормализацию к нижнему регистру вместо того, чтобы просто рассматривать регистр как нерелевантный). Похоже, _stricmp прилагает больше усилий, чтобы сделать то, что естественно ожидать.

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

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..