Библиотека SimpleINI — не удается скомпилировать код с определением SI_NO_CONVERSION

#c #ini

#c #ini

Вопрос:

Я использую библиотеку SimpleINI в Linux. Существует следующий комментарий:

 // Defines the conversion classes for different libraries. Before including
// SimpleIni.h, set the converter that you wish you use by defining one of the
// following symbols.
//
//  SI_NO_CONVERSION        Do not make the "W" wide character version of the 
//                          library available. Only CSimpleIniA etc is defined.
//  SI_CONVERT_GENERIC      Use the Unicode reference conversion library in
//                          the accompanying files ConvertUTF.h/c
//  SI_CONVERT_ICU          Use the IBM ICU conversion library. Requires
//                          ICU headers on include path and icuuc.lib
//  SI_CONVERT_WIN32        Use the Win32 API functions for conversion.
  

Когда я пытаюсь скомпилировать следующий код:

 #define SI_NO_CONVERSION
#include "SimpleIni.h"

int main()
{
    CSimpleIni ini;
    return 0;
}
  

Я получаю ошибку компиляции: ‘CSimpleIniA’ was not declared in this scope Похоже, что SI_NO_CONVERSION не определен в SimpleIni.h. Не могли бы вы объяснить, что происходит?

Комментарии:

1. При сборке Windows также происходит сбой.

2. На веб-странице указано, что это проект c , а не проект c. Вам нужно изменить свои теги, удалив c и добавив c .

3. Проект README.md устарел по отношению к коду, но если вы немного отредактируете примеры readme, то заставите его работать. Это не очень хорошо поддерживаемый проект.

Ответ №1:

SimpleIni.h определяет SI_Case и только SI_NoCase тогда, когда определено либо из SI_CONVERT_GENERIC , SI_CONVERT_ICU либо SI_CONVERT_WIN32 . Это оставляет SI_Case и SI_NoCase неопределенным, когда определено (только) SI_NO_CONVERSION , что приводит CSimpleIniTempl к сбою создания экземпляра шаблона с соответствующими ошибками компиляции. Это ошибка / ошибка в библиотеке, о которой следует сообщить автору.

В качестве обходного пути добавление недостающих определений перед #include "SimpleIni.h" компиляцией кода.

 #define SI_NO_CONVERSION

#define SI_Case     SI_GenericCase    // ***
#define SI_NoCase   SI_GenericNoCase  // ***

#include "SimpleIni.h"

// ... etc ...
  

Ответ №2:

В документе, который вы включили, все сказано:

Определяется только CSimpleIniA etc [когда определена SI_NO_CONVERSION].

Ниже приведена отредактированная версия первого примера в README.md . Макрос SI_ASSERT определен в заголовочном файле, но макросы ASSERT_EQ и ASSERT_STREQ, на которые ссылается пример, не определены. Почти непростительно, что чьи-то примеры не компилируются.

Как я упоминал в комментарии, это не очень хорошо поддерживаемый проект. Инструкции по сборке и тестированию работают не очень очевидным образом. Похоже, у разработчика есть файлы в его рабочей копии, которых нет в репозитории git. Непростительно.

Кроме того, я получаю дополнительные ошибки компиляции при определении SI_NO_CONVERSION. Не используйте этот проект. Вместо этого используйте что-нибудь другое.

 #include "SimpleIni.h"

int main () {
    CSimpleIniA ini;
    ini.SetUnicode();

    SI_Error rc = ini.LoadFile("example.ini");
    if (rc < 0) { /* handle error */ };

    const char* pv;
    pv = ini.GetValue("section", "key", "default");

    ini.SetValue("section", "key", "newvalue");

    pv = ini.GetValue("section", "key", "default");
}
  

Вы компилируете это с помощью чего-то вроде g .

Комментарии:

1. Это не отвечает на мой вопрос. Как насчет использования SI_NO_CONVERSION? Пожалуйста, объясните это.

2. Почему бы не использовать это вместо этого? По крайней мере, пример в README.md работает без особого редактирования.