#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 работает без особого редактирования.