我在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_GENERIC
、SI_CONVERT_ICU
或SI_CONVERT_WIN32
时定义SI_Case
和SI_NoCase
。当(仅(定义了SI_NO_CONVERSION
时,这会使SI_Case
和SI_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++
的东西来编译它。