100个windows平台C++开发错误之编程

来源:互联网 发布:知行天下品牌策划 编辑:程序博客网 时间:2024/06/05 05:36

(61)返回局部变量或其引用

char *GetString(void)

{

         charp[] = "hello world";

         return p;  // 编译器将提出警告

}

内存在函数结束时自动消亡。

(62)strcpy

char ch[2];

memset(ch,0, sizeof(ch));

strcpy(ch,"123456");

编译不报错,有警告,运行会有问题。考虑使用strcpy_s函数。

(63)常量字符串的内容是不可以被修改的。

char a[] = "hello";

a[0] = 'X';

cout << a<< endl;

char *p = "world";      // 注意p指向常量字符串

p[0] = 'X';           // 编译器不能发现该错误

cout<< p << endl;

字符数组a的容量是6个字符,其内容为hello\0。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。

(64)隐式转换导致重载函数产生二义性

# include <iostream>

using namespacestd;

 

void output(int x);    // 函数声明

void output(float x);  // 函数声明

 

void output(int x)

{

    cout << "output int " << x <<endl ;

}

 

void output(float x)

{

    cout << "output float " << x<< endl ;

}

 

void main(void)

{

    int   x = 1;

    float y = 1.0;

    output(x);          // outputint 1

    output(y);          // outputfloat 1

    output(1);          // output int 1

    output(0.5);        // error! ambiguous call, 因为自动类型转换

    output(int(0.5));   // output int 0

    output(float(0.5)); // output float 0.5

}

    第一个output函数的参数是int类型,第二个output函数的参数是float类型。由于数字本身没有类型,将数字当作参数时将自动进行类型转换(称为隐式类型转换)。语句output(0.5)将产生编译错误,因为编译器不知道该将0.5转换成int还是float类型的参数。隐式类型转换在很多地方可以简化程序的书写,但是也可能留下隐患。

(65)用inline取代宏

    C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。

    在C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。例如

    #define MAX(a, b)       (a) > (b) ? (a) : (b)

语句: result = MAX(i, j) + 2 ;

将被预处理器解释为:  result = (i) > (j) ? (i) : (j) + 2 ;

由于运算符‘+’比运算符‘:’的优先级高,所以上述语句并不等价于期望的:   result = ( (i) > (j) ? (i) : (j) ) + 2 ;

如果把宏代码改写为:#defineMAX(a, b)       ( (a) > (b) ? (a) :(b) )

则可以解决由优先级引起的错误。但是即使使用修改后的宏代码也不是万无一失的,例如语句:result = MAX(i++, j);

将被预处理器解释为:result= (i++) > (j) ? (i++) : (j);

    对于C++ 而言,使用宏代码还有另一种缺点:无法操作类的私有数据成员。

0 0
原创粉丝点击