Могу ли я включить / импортировать одну функцию из библиотеки на C++
мне нужно использовать iequals
функция сравнения строк без учета регистра из библиотеки BOOST.
я использую #include <boost/algorithm/string.hpp>
чтобы импортировать его.
есть ли способ, которым я мог бы импортировать только iequals
функция сама по себе?
причина, по которой я даже забочусь (мне действительно просто любопытно.) потому что скомпилированная DLL составляет около 230kB, если я не #include
это и около 1.1 MB, если я это сделаю. В этом конкретном случае не имеет большого значения, насколько велика файл есть, но кажется, что есть много вещей, которые импортируются и никогда не используются. Что делать, если библиотека была несколько ГБ, и мне нужна была только одна из функций? Тогда это станет проблемой, я полагаю.
я, по общему признанию, наивен, когда дело доходит до всего, что связано с cpp, но я чувствую, что не очень эффективно включать некоторые 750kB кода, когда, вероятно, 90% его не используется. Возможно, что iequals
функция использует все это 750kB, у меня нет идея.
опять же, если iequals
функция включает в себя многие из тех же библиотек, файл по-прежнему будет таким же большим.
мысли?
заранее спасибо за любые советы.
EDIT:
Спасибо за ответы. Я стараюсь их понять.
Я Инженер-химик, который переписывает кучу ужасно медленных и плохо оптимизированных макросов VBA в DLL C++. До сих пор результаты были выдающийся и все работает правильно. Я просто не вижу необходимости лишний размер, если мне нужен только один тип сравнения между двумя строками.
пример сравнения, которое мне нужно сделать, выглядит следующим образом:
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);
}
, которая называется via:
if (wStrCmp(Gas, L"Methane") or
wStrCmp(Gas, L"CH4") or
wStrCmp(Gas, L"C1")) return 1;
эти последние 2 блока практически вставлены из моего кода.
еще раз спасибо, ребята.
1 ответов
поверьте мне, вы уже просто включить boost::algorithm::iequals
но его использовать boost::range
и std::locale
возможно, вы не используете их в других местах своего кода, поэтому это делает ваш код намного больше, поэтому я думаю, что для вашего случая нет другого способа сделать это, если вы не используете какую-то нестандартную функцию, такую как stricmp
или strcasecmp
.
если вы хотите сравнить широкие строки в Windows (например,BSTR
) можно использовать _wcsicmp
из ЭЛТ или lstrcmpiW
из среды выполнения Windows(объявленное в Kernel32.lib
что возможно, вы уже связаны с ним).