【问题标题】:Can I include/import a single function from a library in C++我可以从 C++ 的库中包含/导入单个函数吗
【发布时间】:2012-10-26 18:47:04
【问题描述】:

我只需要使用 BOOST 库中的iequals 不区分大小写的字符串比较函数。

我正在使用#include <boost/algorithm/string.hpp> 来导入它。

有什么办法只能自己导入iequals函数吗?

我什至关心的原因(我真的只是好奇。)是因为如果我不 #include 它编译的 DLL 大约是 230kB,如果我这样做的话大约是 1.1MB。在这种特殊情况下,文件的大小并没有太大的区别,但似乎有很多东西被导入但从未使用过。如果库只有几 GB 而我只需要其中一个功能怎么办?我想这将成为一个问题。

当涉及到与 cpp 相关的任何事情时,我承认我很天真,但我觉得包含大约 750kB 的代码,而其中可能有 90% 的代码没有被使用,这并不是很有效。可能是 iequals 函数使用了全部 750kB,我不知道。

再一次,如果iequals 函数包含许多相同的库,文件仍然会一样大。

想法?

提前感谢您的任何建议。

编辑:

感谢您的回复。我正在尽我所能理解他们。

我是一名化学工程师,正在将一堆速度极慢且优化不佳的 VBA 宏重写为 C++ DLL。到目前为止,结果非常出色,一切正常。如果我只需要在两个字符串之间进行单一类型的比较,我只是不认为需要额外的文件大小。

我需要做的比较示例如下:

if (SomeBSTR == "SomeTextHere") {
    // do stuff
}

或更准确地说:

if (Gas == "Methane"    or
    Gas == "CH4"        or
    Gas == "C1")        return 1;

if (Gas == "Ethane"     or
    Gas == "C2H6"       or
    Gas == "C2")        return 2;

如果这是我必须做的唯一比较类型,我可以用比以下更简单的方式来做吗:

int wStrCmp(const BSTR Str1, const wstring Str2) {

    wstring wStr1(Str1, SysStringLen(Str1));

    return boost::iequals(Str1, Str2);
}

调用方式:

if (wStrCmp(Gas, L"Methane")      or
    wStrCmp(Gas, L"CH4")          or
    wStrCmp(Gas, L"C1"))          return 1; 

最后两个块实际上是从我的代码中粘贴的。

再次感谢各位。

【问题讨论】:

标签: c++ linker g++ binutils


【解决方案1】:

相信我你已经只包含了boost::algorithm::iequals,但它使用了boost::rangestd::locale,你可能不会在代码的其他地方使用它们,所以这会使你的代码更大,所以我猜您的情况没有其他方法可以做到这一点,除非您使用一些非标准功能,如 stricmpstrcasecmp

如果您想在 Windows 上比较宽字符串(例如 BSTR),您可以使用 CRT 中的 _wcsicmp 或 Windows 运行时中的 lstrcmpiW(在 Kernel32.lib 中声明,可能您已经与它链接了)。

【讨论】:

  • 也许有更好的方法来做我想要做的比较。我需要获取一个 BSTR(来自 Excel)并将其与另一个字符串(当前使用 L"text" 作为另一个字符串)进行比较,与大小写无关。我发现比较 BSTR 和其他字符串的最简单方法是将 L"text 用于其他字符串和 boost/algorithm/string.hpp 标头。我只是希望它没有使文件大小翻四倍。
  • @Dr3vvn45ty 不是你还没有看过,但是,lstrcmpiw() 会做你想要的吗?也许不是,但至少值得一看,毕竟它是 Windows。如果不是这样,那么CompareString() 可能是您更好的选择。只是想法。
  • @WhozCraig 也许如果我可以将 BSTR 减少到 LPCTSTR。我会调查的。谢谢。
  • @Dr3vvn45ty BSTR,除非经过专门设计以包含嵌入的空字符,否则已经是宽字符字符串。 IOW,您可以使用 Excel 中的 BSTR 作为 lstrcmpi() 的宽字符版本的参数之一,(即 lstrcmpiw()(注意我前面提到的“w”) .如果您需要更大的灵活性(语言环境等),CompareString() 可能更适合您。但至少在 Windows 下,您绝对不必为了比较两个不区分大小写的宽字符串而吸入 boost lib。操作系统已经对它提供了原生支持。
  • 哦,+1 很好地解释了为什么引入看起来非常小的东西可以比你最初预期的提升更多。 gj,BB。
猜你喜欢
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
相关资源
最近更新 更多