2012-10-26 6 views
6

Ho solo bisogno di utilizzare la funzione di confronto tra stringhe senza distinzione tra maiuscole e minuscole maiuscole e minuscole della libreria BOOST iequals.È possibile includere/importare una singola funzione da una libreria in C++

Sto utilizzando #include <boost/algorithm/string.hpp> per importarlo.

Esiste un modo per importare solo la funzione iequals?

Il motivo per cui mi interessa (sono davvero curioso) è perché la DLL compilata è di circa 230kB se non lo faccio #include e circa 1,1 MB se lo faccio. In questo caso particolare, non fa molta differenza quanto è grande il file, ma sembra che ci sia un sacco di cose che vengono importate e mai usate. Cosa succede se la libreria era di pochi GB e avevo solo bisogno di una delle funzioni? Allora diventerebbe un problema, immagino.

Sono certamente ingenuo quando si tratta di qualsiasi cosa relativa a cpp-related, ma ritengo che non sia molto efficiente includere circa 750kB di codice quando probabilmente il 90% di esso non viene utilizzato. Potrebbe essere che la funzione iequals usi tutto questo 750kB, non ne ho idea.

Quindi, ancora una volta, se la funzione iequals include molte delle stesse librerie, il file sarebbe comunque altrettanto grande.

Pensieri?

Grazie in anticipo per qualsiasi consiglio.

MODIFICA:

Grazie per le risposte. Sto facendo del mio meglio per capirli.

Sono un ingegnere chimico che sta riscrivendo un mucchio di macro VBA orribilmente lente e scarsamente ottimizzate in una DLL C++. Finora i risultati sono stati eccezionali e tutto funziona correttamente. Semplicemente non vedo la necessità della dimensione extra del file se ho solo bisogno di fare un singolo tipo di confronto tra due stringhe.

Un esempio del confronto ho bisogno di fare è la seguente:

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

o più esattamente:

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

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

Se questo è il solo tipo di confronto che devo fare, può io lo faccio in un modo più semplice di:

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

    wstring wStr1(Str1, SysStringLen(Str1)); 

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

che si chiama via:

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

Questi ultimi 2 blocchi sono praticamente incollati dal mio codice.

Grazie ancora, ragazzi.

+1

Hai pensato di usare [ 'strcasecmp'] (http://linux.die.net/man/3/strcasecmp) (POSIX) o [' _stricmp'] (http://msdn.microsoft.com/en -us/library/k59z8dwe% 28v = vs80% 29.aspx) (Windows) invece? –

risposta

2

credetemi già è sufficiente includere boost::algorithm::iequals ma usa boost::range e std::locale che forse voi non li uso in altri luoghi del codice, quindi questo rendere il codice molto più grande, quindi credo che per il vostro caso non c'è altro modo per farlo a meno che non si utilizzi una funzione non standard come stricmp o strcasecmp.

Se si desidera confrontare le stringhe larghe su Windows (ad esempio BSTR) è possibile utilizzare _wcsicmp da CRT o lstrcmpiW da tempo di esecuzione di Windows (dichiarata in Kernel32.lib che forse avete già collegato con esso).

+0

Forse c'è un modo migliore di fare ciò che sto cercando di fare con il confronto. Ho bisogno di prendere un BSTR (da Excel) e confrontarlo con un'altra stringa (attualmente usando 'L 'testo'' come l'altra stringa), indipendente dal caso. Il modo più semplice che ho trovato per confrontare il BSTR e l'altra stringa è usare il 'L" testo per l'altra stringa e l'intestazione 'boost/algorithm/string.hpp'. Vorrei solo che non lo facesse la dimensione del file quadrupla – Dr3vvn45ty

+1

@ Dr3vvn45ty non che non hai già guardato, ma, sarebbe [lstrcmpiw()] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms647489 (v = vs.85) .aspx) fai quello che stai cercando, forse no, ma vale almeno un aspetto dato che è Windows, dopotutto. Se non è così, allora forse [CompareString()] (http: // msdn. microsoft.com/en-us/library/windows/desktop/dd317759(v=vs.85).aspx) può essere una scelta migliore per voi. a soli idee. – WhozCraig

+0

@WhozCraig Forse se potessi ridurre il BSTR a un LPCTSTR Vi darò un'occhiata, grazie – Dr3vvn45ty

Problemi correlati