急求:有什么方法可以把同一变量名根据不同条件定义成不同的数据类型 急求:有什么方法可以把同一变量名根据不同条件定义成不同的数据类型,ex:变量名s1,根据条件可以定义成int,double,char... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那么具体怎么用#ifdef,我这样用的 CStringArray m_ParType; m_ParType.Add(0); m_ParType.Add(0); m_ParType.Add(1); int parcount =3; if(parcount =1) { int flag1=atoi(m_ParType.GetAt(0)); #ifdef flag1 char s1[1000]; #elif flag1 int s1; #elif flag1 double s1; #else flag1 BOOL s1; #endif } 报错:error C2065: 's1' : undeclared identifier 使用 变体型VARIANT 变量 template<typename T>void testmethod(T x){ cout << x;}testmethod(1);testmethod("222");testmethod(1.011f); CString CVarInitTypePrtyPage::VarToStr(COleVariant vData){ CString strTmp; switch(vData.vt) { case VT_BOOL: if(vData.boolVal == VARIANT_FALSE) strTmp = _T("0"); else strTmp = _T("1"); break; case VT_I1: strTmp.Format("%d",vData.cVal); break; case VT_UI1: strTmp.Format("%u",vData.bVal); break; case VT_I2: strTmp.Format("%d",vData.iVal); break; case VT_UI2: strTmp.Format("%u",vData.uiVal); break; case VT_I4: strTmp.Format("%ld",vData.lVal); break; case VT_UI4: strTmp.Format("%lu",vData.ulVal); break; case VT_R4: strTmp.Format("%f",vData.fltVal); break; case VT_R8: strTmp.Format("%f",vData.dblVal); break; case VT_DATE: { COleDateTime dtTmp; dtTmp = vData; CString strTmp1; strTmp1 = "%04d-%02d-%02d %02d:%02d:%02d"; strTmp.Format(strTmp1, dtTmp.GetYear(), dtTmp.GetMonth(), dtTmp.GetDay(), dtTmp.GetHour(), dtTmp.GetMinute(), dtTmp.GetSecond()); } break; case VT_BSTR: strTmp = vData.bstrVal; break; default: strTmp = _T("???"); } strTmp.TrimLeft();strTmp.TrimRight(); return strTmp;}COleVariant vData = "abcd";//定符串// 2字节有符号整数vData.vt = VT_I2;vData.iVal = 123; 条件编译的用法:1#ifdef _XXXX...程序段1...#else...程序段2...#endif 这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。2#ifndef _XXXX ...程序段1... #else ...程序段2... #endif 这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。3#if 常量 ...程序段1...#elif<常量表达式2> ...程序段2...#elif<常量表达式3> ...程序段3... ... ...#else...程序段2...#endif 这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。楼主可以采用第三种情况,给个示例:#define ABC 3main(){#if ABC>0int a=1;printf("%d\n",a);#elif ABC<0int b=-1;printf("%d\n",b);#elseint c=0;printf("%d\n",c);#endif}9楼采用模板,好方法,模板设计时有一个方面就是为了简化上面的编程. VARIANT and VARIANTARG 果然好强大以前没怎么接触COM,10楼的方法没用过,飘过,学习... 真的要看你的程序是出于什么要求才会有这种考虑,具体实现,上面的几位都提到了,都是可以的1. 宏定义#ifdef 一般用于代码跨平台或者跨操作系统的条件编译,用于变量类型的条件编译很少2. VARIANT一般用于跨语言数据传递,如果你是在COM开发中遇到这种问题,可以考虑使用VARIANT,但是话说回来,如果是做COM开发,也就不太可能提出这种问题,COM里面自然都会使用到VARIANT到3. 模板template,我猜你的程序是出于对某个常用函数的不同参数类型考虑吧,我建议你采用这种方法,这是比较标准的处理方法,C#里面的泛型,C++里面的模板,都是专干这个的。4. 最后我向你推荐使用boost里面的any数据类型,any把所有数据类型大小通吃,包括你自定义的数据类型,具体怎么用,去看看boost使用指南 比如说class a{protected: boost::any m_var;public: void setvalue(boost::any v){m_var=v;} boost::any getvalue(){return m_var;}}//how to useclass a;a.setvalue(123);int v1 = boost::any_cast<int>(a.getvalue());a.setvalue("123");string v2 = boost::any_cast<string>(a.getvalue()); 请问11楼2种条件很好办,如果是4重条件怎么进行条件编译,那个常量和常量表达式怎么设置我用的时候好像只能设置成>0或者<0两种 鼠标点击子窗口,这个消息是父窗口还是子窗口先获得?父窗口可以获得吗? 【请教】如何中止循环语句? DWORD_PTR是什么数据类型?怎么转换为CString? 图片刷新的问题 动态连接库为什么没有.dll 文件那? 关于windows创建和杀死一个进程的消息 HDC是什么呀 我动态创建的 10 个CEDIT 怎么句柄都是一样的呀 ?》??? 大虾们!如何在VC的应用程序里显示GIF图片? vc 2005中,BYTE变量内存中占为什么2个字节空间? CListCtrl 项刷新问题 灰度图的简单问题
CStringArray m_ParType;
m_ParType.Add(0);
m_ParType.Add(0);
m_ParType.Add(1);
int parcount =3;
if(parcount =1)
{
int flag1=atoi(m_ParType.GetAt(0));
#ifdef flag1
char s1[1000];
#elif flag1
int s1;
#elif flag1
double s1;
#else flag1
BOOL s1;
#endif
}
报错:error C2065: 's1' : undeclared identifier
void testmethod(T x)
{
cout << x;
}
testmethod(1);
testmethod("222");
testmethod(1.011f);
CString CVarInitTypePrtyPage::VarToStr(COleVariant vData)
{
CString strTmp;
switch(vData.vt)
{
case VT_BOOL:
if(vData.boolVal == VARIANT_FALSE)
strTmp = _T("0");
else
strTmp = _T("1");
break;
case VT_I1:
strTmp.Format("%d",vData.cVal);
break;
case VT_UI1:
strTmp.Format("%u",vData.bVal);
break;
case VT_I2:
strTmp.Format("%d",vData.iVal);
break;
case VT_UI2:
strTmp.Format("%u",vData.uiVal);
break;
case VT_I4:
strTmp.Format("%ld",vData.lVal);
break;
case VT_UI4:
strTmp.Format("%lu",vData.ulVal);
break;
case VT_R4:
strTmp.Format("%f",vData.fltVal);
break;
case VT_R8:
strTmp.Format("%f",vData.dblVal);
break;
case VT_DATE:
{
COleDateTime dtTmp;
dtTmp = vData;
CString strTmp1;
strTmp1 = "%04d-%02d-%02d %02d:%02d:%02d";
strTmp.Format(strTmp1,
dtTmp.GetYear(),
dtTmp.GetMonth(),
dtTmp.GetDay(),
dtTmp.GetHour(),
dtTmp.GetMinute(),
dtTmp.GetSecond());
}
break;
case VT_BSTR:
strTmp = vData.bstrVal;
break;
default:
strTmp = _T("???");
}
strTmp.TrimLeft();strTmp.TrimRight();
return strTmp;
}COleVariant vData = "abcd";//定符串// 2字节有符号整数
vData.vt = VT_I2;
vData.iVal = 123;
1
#ifdef _XXXX
...程序段1...
#else
...程序段2...
#endif
这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
2
#ifndef _XXXX
...程序段1...
#else
...程序段2...
#endif
这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。
3
#if 常量
...程序段1...
#elif<常量表达式2>
...程序段2...
#elif<常量表达式3>
...程序段3...
... ...
#else
...程序段2...
#endif
这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。楼主可以采用第三种情况,给个示例:#define ABC 3
main()
{
#if ABC>0
int a=1;
printf("%d\n",a);
#elif ABC<0
int b=-1;
printf("%d\n",b);
#else
int c=0;
printf("%d\n",c);
#endif
}
9楼采用模板,好方法,模板设计时有一个方面就是为了简化上面的编程.
以前没怎么接触COM,10楼的方法没用过,飘过,学习...
2. VARIANT一般用于跨语言数据传递,如果你是在COM开发中遇到这种问题,可以考虑使用VARIANT,但是话说回来,如果是做COM开发,也就不太可能提出这种问题,COM里面自然都会使用到VARIANT到
3. 模板template,我猜你的程序是出于对某个常用函数的不同参数类型考虑吧,我建议你采用这种方法,这是比较标准的处理方法,C#里面的泛型,C++里面的模板,都是专干这个的。
4. 最后我向你推荐使用boost里面的any数据类型,any把所有数据类型大小通吃,包括你自定义的数据类型,具体怎么用,去看看boost使用指南
比如说class a
{
protected:
boost::any m_var;
public:
void setvalue(boost::any v){m_var=v;}
boost::any getvalue(){return m_var;}
}
//how to use
class a;
a.setvalue(123);
int v1 = boost::any_cast<int>(a.getvalue());
a.setvalue("123");
string v2 = boost::any_cast<string>(a.getvalue());
我用的时候好像只能设置成>0或者<0两种