【问题标题】:SimpleINI library - can't compile a code with SI_NO_CONVERSION definedSimpleINI 库 - 无法编译定义了 SI_NO_CONVERSION 的代码
【发布时间】:2020-10-07 09:40:02
【问题描述】:

我在 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 中定义。你能解释一下发生了什么吗?

【问题讨论】:

  • 在 Windows 上构建也失败了。
  • 网页上说是c++项目,不是c项目。您需要更改标签,删除 c 并添加 c++。
  • 项目的 README.md 在代码方面已经过时了,但是如果您稍微编辑一下自述文件的示例,您就可以使用它。这不是一个维护良好的项目。

标签: c++ ini


【解决方案1】:

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 ...

【讨论】:

    【解决方案2】:

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

    仅定义 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++的东西编译它。

    【讨论】:

    • 它没有回答我的问题。使用 SI_NO_CONVERSION 怎么样?请解释一下。
    • 为什么不改用this?至少 README.md 中的示例无需太多编辑即可工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2017-01-16
    相关资源
    最近更新 更多