SimpleINI 库 - 无法编译定义了 SI_NO_CONVERSION 的代码
SimpleINI library - can't compile a code with SI_NO_CONVERSION defined
我在 Linux 上使用 SimpleINI 库。有以下评论:
// 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 中定义。你能解释一下这是怎么回事吗?
您提供的文档说明了一切:
Only CSimpleIniA etc is defined [when SI_NO_CONVERSION is defined].
以下是 README.md
中第一个示例的编辑版本。 SI_ASSERT 宏在头文件中定义,但示例中引用的 ASSERT_EQ 和 ASSERT_STREQ 宏没有定义。某人的示例无法编译几乎是不可原谅的。
正如我在评论中提到的,这不是一个 well-maintained 项目。构建和测试的说明不是很明显。似乎开发人员在他的工作副本中有一些文件不在 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++
.
之类的东西编译它
当定义了 SI_CONVERT_GENERIC
、SI_CONVERT_ICU
或 SI_CONVERT_WIN32
时,SimpleIni.h
仅定义 SI_Case
和 SI_NoCase
。这使得 SI_Case
和 SI_NoCase
在(仅) SI_NO_CONVERSION
被定义时未定义,这导致 CSimpleIniTempl
模板实例化失败,并出现相关的编译错误。这是图书馆的oversight/bug,应该向作者报告。
作为解决方法,在 #include "SimpleIni.h"
获取要编译的代码之前添加缺少的定义。
#define SI_NO_CONVERSION
#define SI_Case SI_GenericCase // ***
#define SI_NoCase SI_GenericNoCase // ***
#include "SimpleIni.h"
// ... etc ...
我在 Linux 上使用 SimpleINI 库。有以下评论:
// 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 中定义。你能解释一下这是怎么回事吗?
您提供的文档说明了一切:
Only CSimpleIniA etc is defined [when SI_NO_CONVERSION is defined].
以下是 README.md
中第一个示例的编辑版本。 SI_ASSERT 宏在头文件中定义,但示例中引用的 ASSERT_EQ 和 ASSERT_STREQ 宏没有定义。某人的示例无法编译几乎是不可原谅的。
正如我在评论中提到的,这不是一个 well-maintained 项目。构建和测试的说明不是很明显。似乎开发人员在他的工作副本中有一些文件不在 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++
.
SI_CONVERT_GENERIC
、SI_CONVERT_ICU
或 SI_CONVERT_WIN32
时,SimpleIni.h
仅定义 SI_Case
和 SI_NoCase
。这使得 SI_Case
和 SI_NoCase
在(仅) SI_NO_CONVERSION
被定义时未定义,这导致 CSimpleIniTempl
模板实例化失败,并出现相关的编译错误。这是图书馆的oversight/bug,应该向作者报告。
作为解决方法,在 #include "SimpleIni.h"
获取要编译的代码之前添加缺少的定义。
#define SI_NO_CONVERSION
#define SI_Case SI_GenericCase // ***
#define SI_NoCase SI_GenericNoCase // ***
#include "SimpleIni.h"
// ... etc ...