C语言编译出现函数参数默认int类型的[-Wimplicit-int]警告如何解决
C程序编译告警修复说明
触发当前告警的直接原因
你遇到的两条告警,根源是saberi函数使用了C语言旧标准的隐式int参数规则编写:
int saberi(sum, b){ return sum + b; }
按照现代C语言(C99及之后版本)的语法要求,函数定义的所有参数都必须显式标注类型;如果不写参数类型,编译器会默认把sum和b推断为int类型,这就触发了-Wimplicit-int的编译告警。
第一步:消除当前告警
直接给两个参数补上显式的int类型标注即可,修改后的函数代码:
int saberi(int sum, int b){ return sum + b; }
修改完成后重新编译,两条隐式int的告警就会完全消失。
后续调试需要处理的关联逻辑bug
这些问题不会触发编译告警,但会导致程序运行结果完全错误或者直接崩溃,可参考以下要点排查:
- 给
saberi传的参数类型错误:当前代码里写的是(*saberi)(suma, *argv[i]),*argv[i]是参数字符串第一个字符的ASCII编码,不是需要累加的整数值,需要用atoi(argv[i])把字符串格式的参数转成整数再传入。 - 参数下标自增逻辑重复:判断
-b/-s标记的时候用了argv[i++]做比较,后面的do-while循环内部又执行了一次i++,会导致参数下标连续跳两次,漏读有效参数。 - 循环终止条件逻辑写反:当前do-while的判断条件是
strcmp(...) != 0 || i < argc,使用了逻辑或,只要下标没越界就会一直循环,最终会越界访问argv数组。正确的终止逻辑应该是同时满足「下标在有效参数范围内」「没碰到下一个参数标记」两个条件,也就是把逻辑或改成逻辑与。 - 字符串拼接的传参逻辑错误:调用
dodaj函数的时候,会把-s/-b这类参数标记字符串也拼进去,实际应该跳过标记本身,只拼接标记后面的有效字符串参数。
内容的提问来源于stack exchange,提问作者qu4lizz
相关产品推荐
相关产品推荐

