Welcome

首页 / 软件开发 / C++ / C++的可移植性和跨平台开发[2]:语法

C++的可移植性和跨平台开发[2]:语法2011-04-14编程随想目前还有相当一部分开发人员在使用老式编译器干活,这些老式编译器可能对C++98支持 不够。因此,当你的代码移植到这些老式的编译器上时,可能会碰到一些稀奇古怪的问题( 包括编译出错和运行时错误)。下面这些注意事项有助于你绕过这些问题。

强调一下 ,后面提到的好几个条款都是通过回避C++的新语法来保证移植性。如果你用的是新式编译器 ,那么你可以不理会这些条款。

★小心for循环变量的作用域(不支持新标准)

在C++98标准中,for循环变量的作用域局限在循环体内。而某些老的编译器(例如 Visual C++ 6)认为for循环变量的作用域在循环体外。所以如下的代码可能导致移植问题。

{
for(int i=0; i<XX; i++)
{
// ...
}
for(int i=0; i<XXX; i++)
{
// ...
}
}

建议修改为不同的循环变量,如下所示:

{
for (int i=0; i<XX; i++)
{
// ...
}
for(int j=0; j<XXX; j++)
{
// ...
}
}

★不 要使用全局类对象,改用单键(标准未定义)

全局类对象的构造函数先于main()函数 执行,如果某个模块中同时包含若干个全局类对象,则它们的构造函数的调用顺序是不确定 的。而单键是在第一次调用时被初始化,能避免此问题。另外,单键虽然解决了构造问题, 但是析构依然有隐患。详见“C++ 对象是怎么死的?进程篇”。

★保持 inline函数尽量简单

不要在inline函数内部使用局部静态变量,不要在inline函数使 用可变参数。这些都有可能导致移植问题。

★不要依赖函数参数的求值顺序(标准未 定义)

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

void Foo(int a, int b);
int n = 1;
foo(++n, ++n);