微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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_CaseSI_NoCaseSI_CONVERT_GENERIC中的任何一个时定义SI_CONVERT_ICUSI_CONVERT_WIN32。仅当定义SI_Case时,SI_NoCaseSI_NO_CONVERSION仍未定义,这导致CSimpleIniTempl模板实例化失败,并带有相关的编译错误。这是库中的疏忽/错误,应报告给作者。

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

#define SI_NO_CONVERSION

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

#include "SimpleIni.h"

// ... etc ...
,

您包含的文档说明了一切:

仅在定义SI_NO_CONVERSION时定义CSimpleIniA等。

下面是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","newvalue");

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

您可以使用g++之类的语言进行编译。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。