6

iequalsBOOST ライブラリの大文字と小文字を区別しない文字列比較関数を使用するだけです。

使っ#include <boost/algorithm/string.hpp>て輸入しています。

iequals関数を単独でインポートする方法はありますか?

私が気にする理由は (私は本当に興味があるだけです.)、コンパイルされた DLL は、そうしないと約 230kB であり、そうすると約 1.1MB#includeになるからです。この特定のケースでは、ファイルの大きさに大きな違いはありませんが、インポートされて使用されないものがたくさんあるようです。ライブラリが数 GB で、関数の 1 つだけが必要な場合はどうなりますか? それが問題になると思います。

私は cpp 関連のことに関しては確かに世間知らずですが、おそらく 90% が使用されていない場合に 750kB のコードを含めるのはあまり効率的ではないと感じています。iequals関数がその 750kB をすべて使用している可能性がありますが、私にはわかりません。

繰り返しになりますが、iequals関数に同じライブラリが多数含まれている場合でも、ファイルは同じくらい大きくなります。

考え?

アドバイスをよろしくお願いします。

編集:

回答ありがとうございます。私はそれらを理解するために最善を尽くしています。

私は非常に遅く最適化されていない一連の VBA マクロを C++ DLL に書き直す化学エンジニアです。これまでのところ、結果は素晴らしく、すべてが正しく機能しています。2 つの文字列間で 1 つのタイプの比較のみを行う必要がある場合は、余分なファイル サイズが必要になるとは思いません。

私が行う必要がある比較の例は次のとおりです。

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; 

これらの最後の 2 つのブロックは、実際には私のコードから貼り付けられています。

ありがとう、みんな。

4

1 に答える 1

2

あなたがすでに含めていると信じていますboost::algorithm::iequalsが、それはあなたのコードの他の場所でそれらを使用boost::rangestd::localeていない可能性があります、それであなたのコードははるかに大きくなります、それであなたの場合はあなたがいない限りそれをする他の方法はないと思いますstricmpまたはのような非標準の関数を使用しますstrcasecmp

Windowsで幅の広い文字列を比較する場合(たとえばBSTR_wcsicmp、CRTまたはlstrcmpiWWindowsランタイム(Kernel32.libおそらくすでにリンクされていることで宣言されています)から使用できます。

于 2012-10-26T18:54:29.870 に答える