16种C语言编译警告(Warning)类型的解决方法

yizhihongxing

16种C语言编译警告(Warning)类型的解决方法

编写代码时,编译器经常会发出警告。这些警告不一定表示代码有错误,但警告应该受到注意并解决。本文将介绍C语言编译警告的16种类型以及如何解决它们。

1. 程序参数不匹配

int main()
{
    printf("hello World\n");
    return 0;
}

警告信息:warning: return type of 'main' is not 'int' [-Wmain-return-type]

解决方法:修改main函数的返回类型为int

int main()
{
    printf("hello World\n");
    return 0;
}

2. 缺少返回值

int func()
{
    printf("func\n");
}

警告信息:warning: control reaches end of non-void function [-Wreturn-type]

解决方法:在函数末尾添加return语句。

int func()
{
    printf("func\n");
    return 0;
}

3. 不兼容指针类型

int add(int *a, int *b)
{
    return *a + *b;
}

int main()
{
    int a = 1;
    long b = 2;
    printf("%d\n", add(&a, &b));
    return 0;
}

警告信息:warning: incompatible pointer types passing 'long *' to parameter of type 'int *' [-Wincompatible-pointer-types]

解决方法:修改函数参数的类型以匹配调用函数时传递的指针类型。

int add(int *a, long *b)
{
    return *a + *b;
}

int main()
{
    int a = 1;
    long b = 2;
    printf("%d\n", add(&a, &b));
    return 0;
}

4. 不兼容整型类型

int main()
{
    unsigned int unum = 10;
    signed int snum = -10;
    printf("%u, %d\n", unum, snum);
    return 0;
}

警告信息:warning: format '%u' expects argument of type 'unsigned int', but argument 2 has type 'signed int' [-Wformat]

解决方法:使用"%d"格式化符替换"%u"

int main()
{
    unsigned int unum = 10;
    signed int snum = -10;
    printf("%d, %d\n", unum, snum);
    return 0;
}

5. 不兼容字符类型

int main()
{
    char c = 'a';
    printf("%d\n", c);
    return 0;
}

警告信息:warning: format '%d' expects argument of type 'int', but argument 2 has type 'char' [-Wformat]

解决方法:将变量类型转换为int类型。

int main()
{
    char c = 'a';
    printf("%d\n", (int)c);
    return 0;
}

6. 定义未使用的变量

#include <stdio.h>

int main()
{
    int a = 1;
    return 0;
}

警告信息:warning: unused variable 'a' [-Wunused-variable]

解决方法:删除未使用的变量。

#include <stdio.h>

int main()
{
    return 0;
}

7. 格式化字符串中缺少参数

int main()
{
    int a = 1;
    printf("%d, %d\n");
    return 0;
}

警告信息:warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]

解决方法:补充缺少的参数。

int main()
{
    int a = 1;
    printf("%d, %d\n", a);
    return 0;
}

8. 多个定义

int a = 1;
int a = 2;

int main()
{
    return 0;
}

警告信息:warning: redefinition of 'a' with a different type: 'int' vs 'float' [-Wredundant-decls]

解决方法:删除多余的定义。

int a = 1;

int main()
{
    return 0;
}

9. 分支不可达

int main()
{
    if(1)
    {
        return 1;
    }
    else
    {
        return 2;
    }
    return 0;
}

警告信息:warning: control reaches end of non-void function [-Wreturn-type]

解决方法:删除冗余的代码使分支可达。

int main()
{
    if(1)
    {
        return 1;
    }
    else
    {
        return 2;
    }
}

10. 隐式转换

unsigned int a = 1;
signed int b = -1;
if(a > b)
{
    printf("a > b\n");
}
else
{
    printf("a <= b\n");
}
return 0;

警告信息:warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

解决方法:将变量类型统一为相同的类型。

int main()
{
    unsigned int a = 1;
    int b = -1;
    if(a > (unsigned int)b)
    {
        printf("a > b\n");
    }
    else
    {
        printf("a <= b\n");
    }
    return 0;
}

11. 运算符优先级

int main()
{
    int a = 1;
    int b = 2;
    printf("%d\n", a + b & b);
    return 0;
}

警告信息:warning: '&' within '|': may change order of operations [-Wparentheses]

解决方法:增加括号改变运算符的优先级。

int main()
{
    int a = 1;
    int b = 2;
    printf("%d\n", (a + b) & b);
    return 0;
}

12. 整数溢出

int main()
{
    unsigned int a = 0xFFFFFFFF;
    printf("%u\n", a + 1);
    return 0;
}

警告信息:warning: integer overflow in expression [-Woverflow]

解决方法:将变量类型改为更大的类型。

int main()
{
    unsigned long a = 0xFFFFFFFF;
    printf("%lu\n", a + 1);
    return 0;
}

13. 移位结果超出了位宽

int main()
{
    unsigned int a = 0xFF000000;
    printf("%u\n", a << 32);
    return 0;
}

警告信息:warning: left shift count >= width of type [-Wshift-count-overflow]

解决方法:修改移位的位数,或将变量类型改为更大的类型。

int main()
{
    unsigned long a = 0xFF000000;
    printf("%lu\n", a << 32);
    return 0;
}

14. 隐式类型转换

int main()
{
    char a = 1;
    printf("%d\n", a);
    return 0;
}

警告信息:warning: format specifies type 'int' but the argument has type 'char' [-Wformat]

解决方法:显式将变量类型转换为int类型。

int main()
{
    char a = 1;
    printf("%d\n", (int)a);
    return 0;
}

15. 隐式截断

int main()
{
    double a = 1.1234567890123456789;
    float b = a;
    printf("%f\n", b);
    return 0;
}

警告信息:warning: implicit conversion from 'double' to 'float' changes value from 1.12346 to 1.12346 [-Wliteral-conversion]

解决方法:显式将变量类型转换为正确的类型。

int main()
{
    double a = 1.1234567890123456789;
    float b = (float)a;
    printf("%f\n", b);
    return 0;
}

16. 不兼容定义

int main()
{
    const int a = 1;
    int b = 2;
    a = b;

    return 0;
}

警告信息:warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]

解决方法:删除不兼容定义赋值的语句。

int main()
{
    const int a = 1;
    int b = 2;
    // a = b;

    return 0;
}

以上就是16种C语言编译警告类型的解决方法,注意遵循良好的编码规范,及时解决编译器报出的警告。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:16种C语言编译警告(Warning)类型的解决方法 - Python技术站

(1)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Linux C线程池简单实现实例

    下面是Linux C线程池简单实现实例的完整攻略。 1. 简介 线程池是一种常见的并发处理技术,其可以在创建一定数量的线程后,接受任务并将任务交给空闲的线程进行处理。从而减少线程创建和销毁的开销,优化了线程资源的利用。在Linux C中实现线程池,可以使用pthread库进行调用。 2. 实现过程 下面是实现Linux C线程池的步骤: 2.1 定义线程池结…

    C 2023年5月22日
    00
  • C++定时器实现和时间轮介绍

    C++ 定时器实现和时间轮介绍 定时器是计算机系统中非常常见的一种机制,可以用来在一定时间间隔后执行某些操作,或在特定时间点执行某些操作。在 C++ 编程中,我们可以使用定时器来进行任务调度等操作。其中,时间轮是一种常见的定时器实现方式,下面将详细介绍时间轮的概念和实现,以及如何在 C++ 中进行定时器的编写。 什么是时间轮? 时间轮是一种基本的定时器实现方…

    C 2023年5月23日
    00
  • Mybatis-plus操作json字段实战教程

    下面是“Mybatis-plus操作json字段实战教程”的完整攻略: 1. 引入依赖 要操作json字段,我们需要引入fastjson依赖,以及mybatis-plus本身的依赖。在这里我们使用mybatis-plus的最新版本3.4.3: <dependency> <groupId>com.alibaba</groupId&…

    C 2023年5月23日
    00
  • C++算法学习之贪心算法的应用

    C++算法学习之贪心算法的应用 算法简介 贪心算法是一种算法思想,指的是在求解问题时,总是做出当前看来最优的选择,也就是说在每一步中都选择最优解,最终得到全局最优解。 贪心算法的优点在于其简单易懂、运行效率高等特点。但是,由于贪心算法对于求解问题的约束条件和目标函数的要求过高,导致其只能解决部分问题,无法求解所有NP问题。一般情况下,合理的贪心策略是求解问题…

    C 2023年5月22日
    00
  • C 标准库 locale.h

    locale.h 是C标准库中的一个头文件,它提供了本地化对字符串、格式等的处理支持。本文将介绍 locale.h 的完整使用攻略。 1. 包含头文件 使用 locale.h 需要先包含这个头文件。在代码中可以直接使用如下语句来包含: #include <locale.h> 2. 设置本地化环境 locale.h 为我们提供了setlocale(…

    C 2023年5月10日
    00
  • JS对象与json字符串格式转换实例

    JS对象与JSON字符串格式转换是前端开发中常用的一项技术,本文将以实例的方式详细讲解对象与JSON字符串格式的相互转换。 将JS对象转换成JSON字符串格式 使用JSON.stringify()方法 JavaScript中可以使用JSON.stringify()方法将一个对象转换成JSON字符串格式,该方法接收两个参数: 待转换的JS对象 一个可选的rep…

    C 2023年5月23日
    00
  • Win7安装程序遇到错误代码0xc8000222怎么办

    Win7安装程序遇到错误代码0xc8000222 的解决方法 在安装Windows 7的时候,有时会遇到错误代码0xc8000222,导致安装失败。该错误代码是由于Windows Update组件的某些问题引起的,不过该问题并不是很难解决。下面是一些解决方法: 方法1: 检查Windows Update服务 首先,我们需要检查Windows Update服务…

    C 2023年5月23日
    00
  • c语言实现奇偶排序算法

    下面是详细讲解“c语言实现奇偶排序算法”的完整攻略: 什么是奇偶排序算法 奇偶排序算法,也称为奇偶交换排序算法,是一种简单的排序算法。它的特点是同时进行奇数与偶数位置的元素比较和交换,直到序列有序为止。 奇偶排序算法的实现 奇偶排序算法的实现过程可以分为两个阶段,一阶段是进行奇偶位置上元素的比较和交换,二阶段是将相邻的元素比较和交换,两个阶段交替执行,直到序…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部