51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

修正C语言编译警告

本文以编译警告为引入点述说在开发过程中的匪夷所思的问题。引以为鉴,重视警告的影响。

1.未引用形参 {#1未引用形参}

warning: unused variable 'value'.
警告:未使用变量"value"

致命行为:

  • 用错变量导致程序得不到正确结果。

    double sum(double a, double b) { return a; }

  • 变量未使用造成内存泄漏。

    Car car = new Car();

建议:

  • 避免这种行为,但这种情况下大多数出现在作为函数参数。但你要明确的是尽管作为扩展(以后使用)用的函数参数,是否应该考虑下本身设计的问题。

2.可能丢失数据 {#2可能丢失数据}

warning: implicit conversion turns floating-point number into integer: 'double' to 'int'.
警告:隐式转换将浮点数转换为整数:"double"到"int"。

致命行为:

  • 丢失精度,类似于蝴蝶效应,小小的精度却会引起巨大的误差。

  • 整型转换枚举导致枚举变量成不确定值。

    enum Fruits { Apple, Orange, Banana}; Fruits fruits = (Fruits)5; // fruits成不确定值,值取决于编译器。

建议:

  • 强制转换导致丢失数据,应该避免此行为。
  • 但有些情况下却不会,例如整型转换浮点型,枚举转整型。它们都是从小范围转换到大范围。

3.初始化变量顺序不正确 {#3初始化变量顺序不正确}

warning: field 'j' will be initialized after field 'i'.
警告:字段"j"将在字段"i"之后初始化。

致命行为:

  • 导致变量值偏离。

    class Car { public: Car () : j(i + 2), i(1) // 由于j先于i初始化,导致j变量的预期结果却不是3。 { } private: int i; int j; };


建议:

  • 注意:该行为多出现于类和结构体(C++)的构造函数中。
  • 变量之间存在依赖关系容易造成难以想象的bug,就好比怎么有时运行可以,有时却不可以的问题。

4.if语句有空语句 {#4if语句有空语句}

warning: if statement has empty body.
警告:if语句有语句。

致命行为:

  • 有时运行正常,有时运行异常(非常令人恼火的bug)。

    if (enable); // 由于";"语句的存在导致value的值一直不会刷新。 value = sum(i, j);

建议:

  • 必须修正!

5.可能除0 {#5可能除0}

warning: division by zero is undefined.
警告:未定义被零除。

致命行为:

  • 导致程序异常退出。

    value = i / j; // 由于j变量可能为0值,严重会导致程序异常退出。

建议:
-先判断变量是否为不为0,再做运算。

6.变量使用前未初始化 {#6变量使用前未初始化}

warning: variable 'value' is uninitialized when used here.
警告:变量"value"在这里使用时未初始化。

致命行为:

  • 过于相信直觉,以为value默认为0。导致难以想象的bug。

    int value; if (value == 0) // 由于变量未确定初始值,则值不确定会导致判断有时会不进入。 enable = true;

建议:

  • 养成给变量初始化的好习惯。

7.使用=作为比较 {#7使用作为比较}

warning: using the result of an assignment as a condition without parentheses.
警告:将赋值结果用作不带括号的条件。
use '==' to turn this assignment into an equality comparison.
使用'=='将该赋值转换为相等比较

致命行为:

  • 唔使用导致判断一直生效或失效的行为。

    if (i = 1) // 一直生效 enable = true; if (i = 0) // 一直失效 enable = true;


赞(0)
未经允许不得转载:工具盒子 » 修正C语言编译警告