浅谈兼容性

同一c/c++项目在不同的开发环境下使用,可能遭遇兼容性问题。
主要涉及到两点:编译器依赖语言的差异引起兼容性问题。

 

一、依赖编译器等软件提供商相关资源
1.看两段代码:
    char a[] = "I just kill man.";
    short b = 5;
    以上是兼容性代码

 

    CString a = "I just kill man.";
    __int16  b = 5;
    以上不是兼容性代码。CString是MFC的,__int16是微软。

 

2.
    struct ShowTime
    {
        int a;
        char b;
    };
    ShowTime me;
    char *p = (char*)(&me) + 4;
    *p = 'B';


一般情况下,这段代码不会出现问题。但是,假如编译器为了优化系统而移动了字段位置,则不能保证一定能找到我们要的字段(即 p 不一定是char b的地址)。

 

3.循环计数变量的作用域

考虑下面代码:

    for( int cnt = 0; cnt < 28; ++cnt)

    {

    ……   //①作用域

    }

    cout << cnt << endl; //②作用域

 

    一般情况,上面这段代码不能编译,即变量cnt作用域限于循环内(①)。在一些编译器中,可以正常编译,cnt的作用在for外围即②。

 

再看看下面代码:

    for( int i = 0; i < 20; ++i)

    {……}

    for( int i = 0; i < 55; ++i)

    {……}

    在某些编译器中,会出来重复定义变量i的问题。

 

所以,可以养成编码习惯,这样写循环:

    int cnt = 0;

    for( ; cnt < 15; ++cnt)

    {

        ……

    }

 

4.注释
有些人喜欢这样做多行注释:

    //注释多于一行/
    分为好几行/
    第三行

但是,加了这种注释的代码,不能保证能在所有编译器上通过编译。因为有些编译器并不支持这种注释。

另外,C编译器中,没有"//"注释指示符。

 

总而言之,当需要写出兼容性好的代码时,应该尽量基于标准写代码,谨慎写依赖于软件提供商相关资源的代码。开发过程中,我们可使用一些方法来保证程序具有一定的兼容性。

 

二、语言的差异(c/c++)

1.

尽管C++包容了C,但是C与C++具有细微的差异。

比如对于默认参数,C++要严格。看下面的例子:

    ertern int loveme();

    C的理解:定义了一个外部函数,返回int,参数不详;
    C++的理解:等同于 extern int loveme(void);

2.

C/C++混用:
头文件中代码如下所示:

#ifdef __cplusplus
extern "C" {
#endif

 

void thisc(int );

 

#ifdef __cplusplus
}
#endif

 

以后再慢慢补充

 

PS.注意兼容性与可移植性的区别

 

你可能感兴趣的:(编译器,kill,mfc,语言,c,优化)