我使用開源庫 muParser,是用來決議算式的
示例代碼 :
#include <iostream>
#include "muParser.h"
int main(int argc, char* argv[])
{
double var_a = 1;
mu::Parser p;
p.SetExpr("3*8+9-1/8");
std::cout << p.Eval() << std::endl;
return 0;
}
使用 VS2019 ,必須將專案字符集設定成 “使用多位元組字符集”,才能編譯成功。
如果使用默認 “Unicode"字符集,IDE 會檢測出型別錯誤:
E0415 不存在從 "const char [10]" 轉換到 "std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>" 的適當建構式 ConsoleApplication1
C2664 “void mu::ParserBase::SetExpr(const mu::string_type &)”: 無法將引數 1 從“const char [10]”轉換為“const mu::string_type &” ConsoleApplication1
我將 "" 號字串替換成 _T("") ,IDE 型別錯誤消失,但編譯時報錯:
錯誤 LNK2019 無法決議的外部符號 "__declspec(dllimport) public: void __cdecl mu::ParserBase::SetExpr(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)" (__imp_?SetExpr@ParserBase@mu@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@Z),函式 main 中參考了該符號 ConsoleApplication1
好像是無法連接動態庫
請問,如果我一定要用 Unicode 字符集,這個問題能解決嗎?
uj5u.com熱心網友回復:
僅供參考:#pragma warning(disable:4786)
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main () {
wstring ws1,ws2;
wcin.imbue(locale("chs"));
wcout.imbue(locale("chs"));
getline(wcin,ws1);
getline(wcin,ws2);
if (ws1.size()!=ws2.size()) {
wcout<<ws1<<L" 和 "<<ws2<<L" 不對應"<<endl;
return 1;
}
map<wchar_t,wchar_t> m1,m2;
int n=ws1.size();
for (int i=0;i<n;i++) {
if (m1.find(ws1[i])==m1.end() && m2.find(ws2[i])==m2.end()) {
m1[ws1[i]]=ws2[i];
m2[ws2[i]]=ws1[i];
} else {
if (m1[ws1[i]]!=ws2[i] || m2[ws2[i]]!=ws1[i]) {
wcout<<ws1<<L" 和 "<<ws2<<L" 不對應"<<endl;
return 1;
}
}
}
wcout<<ws1<<L" 和 "<<ws2<<L" 對應"<<endl;
return 0;
}
uj5u.com熱心網友回復:
IDE字串編碼是A,使用寬字符W的時候,IDE不認識,需要用_T,CA2W等轉推測你用的動態庫里面是Assic單字符集,所以加_T轉多字符集后,IDE認識了,動態庫不認識
如果庫是Assic,代碼又必須用Unicode,寫代碼的時候用_T或CA2W轉,呼叫庫的地方再轉回單字符集CW2A
uj5u.com熱心網友回復:
具體怎么做呢?
uj5u.com熱心網友回復:
首先上面的回答有的把單字符集,多字符集弄錯了,應該不影響理解
兩個解決方法
1、專案必須使用Unicode字符集
代碼中所有字串用_T或CA2W轉換,這樣IDE不再報錯
呼叫庫函式時,字串常量可以直接傳入,char*,string等變數也可以直接傳參
通過_T或CA2W轉換過的字串用CW2A轉回單字符集再傳參
2、專案可以使用多字符集,直接設定為多字符集,不用再來回轉
反正一句話CW2A,CA2W來回轉,不報錯就是對的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242598.html
標籤:C++ 語言
上一篇:怎么學習音視頻的相關知識
