2012-10-26 12 views
6

Potrzebuję tylko korzystać z funkcji porównywania wielkości liter niewrażliwych na wielkość iequals z biblioteki BOOST.Czy mogę dołączyć/importować pojedynczą funkcję z biblioteki w C++

Do importowania używam #include <boost/algorithm/string.hpp>.

Czy istnieje sposób, aby samodzielnie zaimportować funkcję iequals?

Powód, dla którego się o mnie troszczyłem (jestem naprawdę ciekawy.) Jest to, że skompilowana biblioteka DLL ma około 230kB, jeśli nie mam jej #include i około 1,1 MB, jeśli to zrobię. W tym konkretnym przypadku nie ma większego znaczenia, jak duży jest plik, ale wygląda na to, że jest wiele rzeczy, które są importowane i nigdy nie są używane. Co się stanie, jeśli biblioteka będzie miała kilka GB i potrzebuję tylko jednej z funkcji? Wtedy wyobrażam sobie, że stanie się to problemem.

Jestem wprawdzie naiwny, jeśli chodzi o wszystko, co dotyczy cpp, ale uważam, że nie jest to zbyt wydajne, aby dodać jakieś 750kB kodu, gdy prawdopodobnie 90% z niego nie jest używane. Możliwe, że funkcja iequals wykorzystuje wszystkie te 750kB, nie mam pojęcia.

Ponownie, jeśli funkcja iequals zawiera wiele tych samych bibliotek, plik będzie nadal tak samo duży.

Myśli?

Z góry dziękuję za radę.

EDYTOWANIE:

Dzięki za odpowiedzi. Robię, co w mojej mocy, aby je zrozumieć.

Jestem inżynierem chemii, który przepisuje mnóstwo strasznie wolnych i źle zoptymalizowanych makr VBA do biblioteki DLL C++. Do tej pory wyniki były wyjątkowe i wszystko działało poprawnie. Po prostu nie widzę potrzeby dodatkowego rozmiaru pliku, jeśli potrzebuję tylko jednego typu porównania dwóch ciągów.

Przykładem porównania muszę zrobić to w następujący sposób:

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

lub bardziej dokładnie:

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

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

Jeśli jest to jedyny rodzaj porównania, że ​​muszę to zrobić, może I zrobić to w bardziej prosty sposób niż:

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

    wstring wStr1(Str1, SysStringLen(Str1)); 

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

który jest nazywany przez:

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

Te ostatnie 2 bloki są praktycznie wklejone z mojego kodu.

Jeszcze raz dziękuję, chłopaki.

+1

Czy rozważałeś użycie ['strcasecmp'] (http://linux.die.net/man/3/strcasecmp) (POSIX) lub [' _stricmp'] (http://msdn.microsoft.com/pl -us/library/k59z8dwe% 28v = vs.80% 29.aspx) (Windows) zamiast tego? –

Odpowiedz

2

wierz mi już tylko to boost::algorithm::iequals ale używać boost::range i std::locale że prawdopodobnie nie używać ich w innych miejscach kodu, więc to uczynić kod dużo większe, więc myślę, że w Twoim przypadku nie ma to w inny sposób, aby to zrobić, chyba że używasz niestandardowej funkcji, takiej jak stricmp lub strcasecmp.

Jeśli chcesz porównać szerokie ciągi na Windows (na przykład BSTR) można użyć _wcsicmp z CRT lub lstrcmpiW od starcie Windows (zadeklarowanego w Kernel32.lib że prawdopodobnie już połączonego z nią).

+0

Być może jest lepsze, co zrobić, co próbuję zrobić z porównaniem. Muszę pobrać BSTR (z Excela) i porównać go z innym ciągiem (obecnie używającym tekstu 'L" jako innego ciągu), niezależnie od wielkości liter. Najprostszym sposobem, jaki znalazłem, aby porównać BSTR i inny ciąg, jest użycie tekstu 'L 'dla drugiego napisu i nagłówka' boost/algorithm/string.hpp' . Po prostu chciałbym, żeby to nie było rozmiar pliku jest czterokrotny: – Dr3vvn45ty

+1

@ Dr3vvn45ty nie, że jeszcze nie wyglądałeś, ale, czy [lstrcmpiw()] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms647489 (v = vs.85) .aspx) zrób to, czego szukasz - być może nie, ale przynajmniej warto się temu przyjrzeć, ponieważ w końcu jest to system Windows, jeśli nie to, to może [CompareString()] (http: // msdn. microsoft.com/en-us/library/windows/desktop/dd317759(v=vs.85).aspx) może być dla ciebie lepszą opcją Po prostu pomysły – WhozCraig

+0

@WhozCraig Może jeśli mógłbym zredukować BSTR do LPCTSTR Spojrzę na to. Dzięki. – Dr3vvn45ty

Powiązane problemy