初學 VC++ 時,面對 int、long、float、double、CString、BSTR、_variant_t、_bstr_t、CComBSTR 等類型互相轉換常感困惑。本文整理常見類型轉換方法,供查閱參考。
int i = 100;
long l = 2001;
char temp[200];
itoa(i, temp, 10); // 十進制
itoa(i, temp, 2); // 二進制
ltoa(l, temp, 10); // 長整數
使用 _fcvt 或 sprintf:
double d = 3.1415926535;
int decimal, sign;
char* buffer = _fcvt(d, 7, &decimal, &sign);
// decimal 為小數點位置,sign 為正負號
通用 sprintf 範例:
char buffer[200];
sprintf(buffer, "%d", 35);
sprintf(buffer, "%ld", 1000L);
sprintf(buffer, "%f", 1.732f);
CString str = "2008北京奧運";
char* buf = (LPSTR)(LPCTSTR)str; // 注意 Unicode 專案需用 WideCharToMultiByte
// BSTR
BSTR bstr = ::SysAllocString(L"程序員");
char* buf = _com_util::ConvertBSTRToString(bstr);
SysFreeString(bstr);
// _bstr_t (推薦,運算子重載方便)
_bstr_t bstrVar("test");
const char* buf = bstrVar; // 僅讀
// CComBSTR
CComBSTR bstrVar("test");
char* buf = _com_util::ConvertBSTRToString(bstrVar.m_str);
char temp[] = "123";
int i = atoi(temp);
long l = atol(temp);
double d = atof(temp);
CString str = temp; // 直接賦值
使用 Format 成員函數:
CString str;
str.Format(_T("%d"), 100);
str.Format(_T("%f"), 3.14);
str = "直接賦值字串指標";
SysAllocString/SysFreeString 管理記憶體。_bstr_t,適合 ATL 專案。轉換輔助函數需包含 comutil.h 並連結 comsupp.lib:
BSTR b = _com_util::ConvertStringToBSTR("資料");
char* p = _com_util::ConvertBSTRToString(b);
VARIANT 是 COM 通用資料結構,核心為 vt (類型標籤) 與聯合體數值欄位。
VARIANT va;
VariantInit(&va); // 初始化為 VT_EMPTY
va.vt = VT_I4; // 指定長整數
va.lVal = 2001; // 賦值
常見 vt 對應表:VT_I2(short)、VT_I4(long)、VT_R4(float)、VT_R8(double)、VT_BSTR(BSTR)、VT_BOOL(VARIANT_BOOL)、VT_DISPATCH(IDispatch*) 等。
_variant_t v1(100); // 自動設定 VT_I4
_variant_t v2 = (long)200; // 運算子重載
COleVariant v3("字串"), v4((long)1999);
CString s = (BSTR)v3.pbstrVal;
long val = v4.lVal;
_variant_t 封裝了 VariantInit/VariantClear,大幅降低記憶體洩漏風險,建議優先使用。