龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++的可移植性和跨平台开发[2]:语法(2)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
标准没有明确规定函数参数的求值顺序。因此,如下的代码行为是不确定的。 void Foo(int a, int b); int n = 1; foo(++n, ++n); ★慎用模板特化(不支持新标准) 有

  标准没有明确规定函数参数的求值顺序。因此,如下的代码行为是不确定的。

void Foo(int a, int b);

int n = 1;

foo(++n, ++n);

  ★慎用模板特化(不支持新标准)

  有些老式编译器对偏特化或全特化支持不够。

  ★模板继承中,引用基类成员要小心(不支持新标准)

  看如下例子:

template 

class TBase

{

protected:

 typedef std::vector Container;

 Container m_container;

};

template 

class TDerived : public TBase

{

 typedef TBase BaseClass;

public:

 void Func()

 {

  typename BaseClass::Container foo;  //可移植

  Container foo; //不可移植

  this->m_container.clear(); //可移植

  m_container.clear(); //不可移植

 }

};

  ★慎用RTTI(不支持新标准、标准未定义)

  先声明一下,我这里说的RTTI主要是指typeid操作符和type_info类型。

  首先,由于某些老式编译器可能不支持typeid操作符和type_info类型,会导致移植性的问题,这是慎用RTTI的一个原因。(如果你用的是新式编译器,不用考虑这个因素)

  其次,由于标准对于type_info类型的约束比较简单。这导致了不同的编译器对type_info的实现有较大差异。如果你确实要使用type_info类型,建议仅仅使用它的operator==和operator!=这两个成员函数。

  所以,如果你确实需要在运行时确定类型,又不想碰到上述问题,可以考虑在自己的类体系中加入类型信息来实现。比如MFC和wxWidgets都是这么干的。

精彩图集

赞助商链接