SimpleINI 库 - 无法编译定义SI_NO_CONVERSION的代码



我在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看起来在SimpleIni.h中没有定义SI_NO_CONVERSION。你能解释一下发生了什么吗?

SimpleIni.h仅在定义了SI_CONVERT_GENERICSI_CONVERT_ICUSI_CONVERT_WIN32时定义SI_CaseSI_NoCase。当(仅(定义了SI_NO_CONVERSION时,这会使SI_CaseSI_NoCase未定义,从而导致CSimpleIniTempl模板实例化失败,并出现相关的编译错误。这是库中的一个疏忽/错误,应该向作者报告。

作为一种解决方法,在#include "SimpleIni.h"之前添加缺失的定义可以编译代码。

#define SI_NO_CONVERSION
#define SI_Case     SI_GenericCase    // ***
#define SI_NoCase   SI_GenericNoCase  // ***
#include "SimpleIni.h"
// ... etc ...

包含的文档说明了一切:

只有CSimpleIniA等被定义[当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++的东西来编译它。

相关内容

最新更新