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_GENERICSI_CONVERT_ICUSI_CONVERT_WIN32 时,

SimpleIni.h 仅定义 SI_CaseSI_NoCase。这使得 SI_CaseSI_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 ...