2012-10-26 746 views
6

Tôi chỉ cần sử dụng hàm so sánh chuỗi không phân biệt chữ hoa chữ thường iequals từ thư viện BOOST.Tôi có thể đưa/nhập một hàm đơn từ thư viện trong C++

Tôi đang sử dụng #include <boost/algorithm/string.hpp> để nhập.

Có cách nào để tôi chỉ có thể nhập chính hàm iequals không?

Lý do tôi thậm chí quan tâm (tôi thực sự chỉ tò mò.) Là vì ​​DLL được biên dịch là khoảng 230kB nếu tôi không #include và khoảng 1,1MB nếu tôi làm. Nó không thực sự tạo ra sự khác biệt nhiều trong trường hợp cụ thể này là bao nhiêu, nhưng có vẻ như có rất nhiều thứ được nhập khẩu và không bao giờ được sử dụng. Nếu thư viện là một vài GB và tôi chỉ cần một trong các chức năng? Sau đó, nó sẽ trở thành một vấn đề, tôi tưởng tượng.

Tôi thừa nhận là ngây thơ khi nói đến bất cứ điều gì liên quan đến cpp, nhưng tôi cảm thấy nó không phải là rất hiệu quả để bao gồm một số 750kB mã khi có lẽ 90% của nó không được sử dụng. Có thể là chức năng iequals sử dụng tất cả 750kB đó, tôi không biết.

Sau đó, một lần nữa, nếu hàm iequals bao gồm nhiều thư viện giống nhau, tệp sẽ vẫn lớn.

Suy nghĩ?

Cảm ơn trước vì lời khuyên nào.

CHỈNH SỬA:

Cảm ơn bạn đã trả lời. Tôi đang cố hết sức để hiểu họ.

Tôi là một kỹ sư hóa học đang viết lại một loạt các macro VBA chậm và kém được tối ưu hóa thành một DLL C++. Cho đến nay các kết quả đã được xuất sắc và tất cả mọi thứ hoạt động chính xác. Tôi chỉ không thấy sự cần thiết cho kích thước tập tin thêm nếu tôi chỉ cần làm một loại so sánh duy nhất giữa hai dây.

Một ví dụ về sự so sánh tôi cần phải làm như sau:

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

hoặc chính xác hơn:

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

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

Nếu đây là kiểu CHỈ so sánh mà tôi phải làm, có thể Tôi làm điều đó một cách đơn giản hơn:

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

    wstring wStr1(Str1, SysStringLen(Str1)); 

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

được gọi qua:

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

2 khối cuối cùng này được dán thực tế từ mã của tôi.

Xin cảm ơn một lần nữa, các bạn.

+1

Bạn đã cân nhắc sử dụng ['strcasecmp'] (http://linux.die.net/man/3/strcasecmp) (POSIX) hoặc [' _stricmp'] (http://msdn.microsoft.com/vi -us/library/k59z8dwe% 28v = vs.80% 29.aspx) (Windows) thay thế? –

Trả lời

2

tin rằng bạn đã bao gồm boost::algorithm::iequals nhưng nó sử dụng boost::rangestd::locale mà có thể bạn không sử dụng chúng ở những nơi khác của mã của bạn, vì vậy điều này làm cho mã của bạn lớn hơn rất nhiều, vì vậy tôi đoán trường hợp của bạn không có cách khác để làm điều đó trừ khi bạn sử dụng một số chức năng phi tiêu chuẩn như stricmp hoặc strcasecmp.

Nếu bạn muốn so sánh chuỗi rộng trên Windows (ví dụ BSTR), bạn có thể sử dụng _wcsicmp từ CRT hoặc lstrcmpiW từ Windows runtime (khai báo trong Kernel32.lib mà có thể bạn đã được liên kết với nó).

+0

Có lẽ có một điều tốt hơn để làm những gì tôi đang cố gắng làm với so sánh. Tôi cần phải có một BSTR (từ Excel) và so sánh nó với một chuỗi khác (hiện đang sử dụng "L" văn bản "' là chuỗi khác), độc lập với trường hợp. Cách dễ nhất mà tôi đã tìm thấy để so sánh BSTR và chuỗi khác là sử dụng văn bản 'L 'cho chuỗi khác và tiêu đề' boost/algorithm/string.hpp' Tôi chỉ muốn nó không làm cho kích thước tập tin tăng gấp bốn lần – Dr3vvn45ty

+1

@ Dr3vvn45ty không phải là bạn chưa xem, nhưng, [lstrcmpiw()] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms647489 (v = vs.85) .aspx) làm những gì bạn đang tìm kiếm, có lẽ không, nhưng đáng giá ít nhất là một cái nhìn vì nó là Windows, sau khi tất cả.Nếu không có, thì có lẽ [CompareString()] (http: // msdn. microsoft.com/en-us/library/windows/desktop/dd317759(v=vs.85).aspx) có thể là một lựa chọn tốt hơn cho bạn Chỉ cần ý tưởng – WhozCraig

+0

@WhozCraig Có thể nếu tôi có thể giảm BSTR xuống LPCTSTR Tôi sẽ xem xét điều đó.Cảm ơn – Dr3vvn45ty