本帖总结编译出现的各种warnning和error的原因,持续更新。对本帖中出现的示例函数作个简单的说明:

  1. char* get_char_pointer() : 返回一个char*类型。
  2. int poiner_func(char* p):接收char* 类型的指针。

下面开始记录各种编译警告和错误

  1. 警告:pointless comparison of unsigned integer with a negative constant
    大意为:一个无意义的比较无符号整型和一个负数常量。
    调用者:uint8 len; if(len < -1){return;} 比较正数小于-1 毫无意义。
  2. 警告:implicit declaration of function ‘xxxxxxx’
    代表隐式声明函数,出现在.c文件没有包含对应函数的.h文件就直接调用了那个函数,或者直接调用了在.c里实现的函数,没有在头文件里声明。这种不加头文件的情况要严令禁止。
  3. 警告: assignment makes pointer from integer without a cast [-Wint-conversion]
    出现这个警告的原因是在使用函数之前没有对函数进行声明,未经声明的函数原型一律默认为返回int值。这样,就相当于你调用了返回值为int的函数,并将其赋给了char*、int*等等指针变量,就会出现警告。
  4. 警告: argument to ‘sizeof’ in ‘memset’ call is the same expression as the destination; did you mean to dereference it? [-Wsizeof-pointer-memaccess]
    直译过来就是:“ memset”调用中“ sizeof”的参数与目标的表达式相同; 您是要取消引用它吗?目标表达式指的就是memset第一个参数,也就是指针,很明显提示sizeof也传入了变量指针,应该传入类型说明符和表达式。
    调用者:char *str = get_char_pointer(); memset(str, 0, sizeof(str));就会出现警告。
  5. 警告: initialization makes integer from pointer without a cast [-Wint-conversion]
    调用者:char *id = NULL, name = NULL;
    name = get_char_pointer();
    这样连续定义指针,导致name并未定义成指针,而是定义成了一个int型。
    要么定义成char* id = NULL, *name = NULL; 要么分开定义。
  6. 警告: 传递‘pthread_create’的第 3 个参数时在不兼容的指针类型间转换 [-Wincompatible-pointer-types]
    pthread_create原型:int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void*),void *arg);
    可见第三个参数返回值是void*类型,参数是void*类型,这种错误一般要么是第三个参数返回值写成了void,要么是参数不是void*。出现参数不兼容转换的警告,基本都是这个原因。
    调用者:static void thread_func(void arg),
    pthread_create(&pid, NULL, thread_func, NULL);
    编译便会警告。
  7. 警告: ‘av_free_packet’ is deprecated [-Wdeprecated-declarations]
    表明av_free_packet函数已经过时,不建议使用,由于库在更新迭代过程中产生新的函数,旧的函数不再建议使用,所以调用旧函数时编译会产生警告。
  8. 警告: 函数返回局部变量的地址 [-Wreturn-local-addr]
    在一个函数里定义了一个局部变量,结束时返回这个局部变量的地址,就会出现该警告。因为局部变量是在栈中申请的空间,函数执行完后该空间会自动被释放回收,所以可能你调用这个函数,获取到的返回值并不是你想要的,可能是随机值。也可以说是返回的这个局部变量指针是一个野指针,虽然返回给你了想要的数据,但是这块内存会被别的地方malloc使用,所以最好不要返回局部变量地址,否则后果可能很严重。
  9. 警告: 数组下标类型为‘char’ [-Wchar-subscripts]
    调用者:char index = 0; char ip[16] = {0}; for(…){ip[index++] = “192.168.1.1”;}。因为char类型的变量值可能是负数,所以可能出现ip[index]取到负数索引的数组元素,比如ip[-1],因此编译会有警告。可以把char index 换成 unsigned char index或者int index,但是至于int index为什么不报错,这个不太清楚了,可能int表示范围很大,一般不会越界变成负数吧。
  10. 警告: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
    原因是const修饰的指针变量赋值给了普通指针变量。那么const修饰的指针变量就有可能被修改,这是不允许的。
    调用者:const char* p1; char* p2 = p1;
  11. 警告:"xxxxx"重定义
    代码中某些宏定义在不同的文件中被多次定义,比如多个头文件都有如下定义:#define MAX(a,b) a>b?a:b,在编译过程中就会出现MAX重定义的问题,可将定义改为如下形式,消除警告:
    #ifndef MAX
    #define MAX(a,b) a>b?a:b
    #endif
  12. 警告: 反斜杠和换行为空格所分隔
    调用者:#define HTTP_POST “POST %s HTTP/1.1\r\nHOST: %s:%d\r\nAccept: /\r\n”\
    其原因是最后一个反斜杠后面加了空格,反斜杠换行不能加空格,否则会出现这个警告
  13. 错误:while running ’ aclocal ’ ,autogen.sh :1:eval:aclocal :not found
    此错误发生在编译valgrind的时候执行./autogen.sh,先执行sudo apt-get install automake,安装必要的依赖和库,再执行./autogen.sh即可解决。
  14. 警告: assignment from incompatible pointer type
    翻译:不兼容的指针类型转换,常见的使用情形如下:
    char array[20] = {0}; poiner_func(&array);
    编译警告:int poiner_func(char* p)需要一个char*类型的指针,而传入的是cha(*)[20]类型的指针。
  15. 错误: 对未指定边界的数组的使用无效
    调用者:
int array_pointer_func(char (*p)[ ], int col_size)
{....p = (char(*)[col_size])malloc(sizeof(char) * 10);//注意数组指针分配内存的写法strlcpy(p([idx], data, sizeof(p[idx]));//这一行报错
}
//函数修改为:
int array_pointer_func(char (*p)[64])
{....p = (char(*)[64])malloc(sizeof(char) * 10);strlcpy(p([idx], data, sizeof(p[idx]));//编译通过
}

  具体原因:由于第一个函数的第一个参数没有指明第二维度,虽然第二个参数传入的是第二维度的大小,但是编译器并不知道,除非在函数里给第二维度也分配空间。这里注意给数组指针分配内存的写法。

  1. 错误:expected declaration or statement at end of input
    1、某一个函数或者变量没有在使用之前声明。
    2、某个地方少了个括号。(并不一定是编译器指出错误的地方,这种情况,编译器一般会在最后一行代码报错,但错误很可能不在最后一行,要靠自己去找出来)
  2. 警告:"usleep"和"popen"等函数隐式声明
    虽然包含了头文件<unistd.h>,但是编译时仍提示隐式声明,原因是编译时加了-std=c99参数,改成-std=gnu99或者去掉即可
  3. error: variable ‘xxx’ has initializer but incomplete type
    包含相应的头文件即可
  4. function declaration isn’t a prototype
    因为函数原型和调用这个函数时产生了冲突,如参数类型不一样等。 在C中最常见的情况: 这时会出现了 的警告,因为在C语言中my_fn () 和 my_fn (void)是不一样的,前者可以接受任意参数,而后者不接受任何参数。
  5. error: invalid use of void expression
    将void函数当成有返回值的函数,赋值给别的变量,导致error
  6. error: request for member ‘Interface’ in something not a structure or union
    原本是指针结构体,访问成员应该用"->“,而错误的使用了” . “访问,或者应该用”."却用了“->”
  7. error: unterminated #ifndef
    少了#endif
  8. error: invalid digit “8” in octal constant
    把 08 改成 8 就可以了, C++ 中数字前面加个 0 表示 8 进制。所以 08 表示 8 进制的 8 了,而8 进制数字范围是 0 - 7,所以 8 在 8 进制中是非法的数字,自然编译错误了。
  9. warning: ISO C90 forbids mixed declarations and code
    变量定义之前任何一条非变量定义的语句(注意:语句是会带分号的)都会引起这个警告!将非变量的定义移到变量定义之后 即可

No pains,no gains.

C语言编译警告和报错整理-持续更新相关推荐

  1. PyCharm使用期间出现报错集合 持续更新ing

    PyCharm使用期间出现报错集合 持续更新ing 啥时候用PyCharm发现了奇奇怪怪的错误就整理上来 这几天帮同学安装torch的时候出现了一些奇奇怪怪的问题 1.torch始终安装失败 描述一下 ...

  2. react+typescript报错集锦持续更新

    typescript报错集锦 错误:Import sources within a group must be alphabetized.tslint(ordered-imports) 原因:impo ...

  3. Linux系统运行C语言编译的二进制文件报错:Segmentation fault

    报错信息如下图所示: 当我运行Gps_Analysis二进制文件时出现如上错误,主函数源代码如下图所示: 于是我网上查了一下,讲得很专业.很详细,总结一下出现"Segmentation fa ...

  4. MySQL数据库报错汇总(持续更新中)

    报错1:DATA truncated FOR COLUMN 'description' AT ROW 1 错误再现 表中存在null字段 此时,修改表中某字段为主键 解决方法 不允许数据库中出现nul ...

  5. K8S 报错笔记--持续更新

    一.ContainerCreating 这种报错其实不算报错,容器正在创建中,通常是我们配置问题导致的, 1.docker服务问题 有一天起来有个应用说容器创建不出来,卡在ContainerCreat ...

  6. Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...)

    Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...) 目录 Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...) 一.Android s ...

  7. qt(c++)数组越界编译不会报错

    qt(c++)数组越界编译不会报错,运行后也不会报错,除非更改了非常重要的数据导致程序崩掉,不然不一定崩掉. 但是c语言编译就会报警告,运行后也不会报错的,编译如下所示 main.c(24): war ...

  8. C/C++ 编译的时候报错“LNK2019: 无法解析的外部符号:xxx,该符号在xxx中被引用”

    当出现 编译的时候报错"LNK2019: 无法解析的外部符号:xxx,该符号在xxx中被引用" 的时候 . 分析原因: 出现这个LNK错误是链接错误,因为c/c++程序需要经过:预 ...

  9. ClickHouse系列教程七:centos下源码编译安装及报错解决

    ClickHouse系列教程: ClickHouse系列教程 参考上一篇博客: ClickHouse系列教程六:源码分析之Debug编译运行 先安装 gcc 8, g++ 8, cmake 3, ni ...

  10. linux下编译make文件报错“/bin/bash^M: 坏的解释器,使用grep快速定位代码位置

    一.linux下编译make文件报错"/bin/bash^M: 坏的解释器 参考文章:http://blog.csdn.net/liuqiyao_01/article/details/415 ...

最新文章

  1. python try catch 能知道是哪一行代码_能导致3.7亿美元损失的异常,到底是怎么回事?...
  2. var和function谁先优先执行_变量var声明和函数function声明优先级
  3. docker 容器安装conposer_docker和php:将依赖项(composer)放入容器中
  4. 洛谷入门题P1008、P1035、P1423、P1424、P1980题解(Java语言描述)
  5. 【重点!记忆化递归+DP】LeetCode 72. Edit Distance
  6. 【转】那些令人喷饭的注释
  7. 在spring管理的类的要注意问题
  8. tensorflow--制作数据集tfrecords文件
  9. python函数大全pdf_python内置函数大全.pdf
  10. 最新搜狗收录提交工具分享
  11. python网上下载视频,音乐
  12. 大数据实战之用户画像概念、项目概述及环境搭建
  13. Linux下 PyDev + Eclipse安装方法
  14. Mysql索引命中级别
  15. Altium Designer出现collision警告
  16. TC3XX 多核ECU的中断向量表解疑
  17. [POI2014]FAR-FarmCraft 树形DP + 贪心思想
  18. 根据网卡MAC地址确定对应交换机端口
  19. 以赛促练-力扣第85场双周赛以及第307场周赛
  20. Oracle -- 分析函数

热门文章

  1. 无穷级数求和例题_无穷级数求和的若干方法(毕业论文).doc
  2. CRM 安装不规范,亲人两行泪
  3. Android开发中导入字体库
  4. c语言中6 2等于多少,概率中C62怎么算(6是下标,2标在上面)
  5. 合金电阻分类与合金电阻详细参数介绍
  6. Python统计字符串中的中英文字符、数字空格,特殊字符 , 空格的个数
  7. 用PS设计曲线四分环
  8. 文件夹批量重命名方法
  9. 使用ps修改图片大小不影响清晰度的方法
  10. Unity资源热更-Addressables总结(一)