记录一次奇怪但是很有意义的程序编译警告
Posted guochaoxxl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一次奇怪但是很有意义的程序编译警告相关的知识,希望对你有一定的参考价值。
代码都很简单就是一个简单的分模块的建议计算器,不考虑实用性和健壮性,就是个上课的小demo程序,只要能说明问题就行:
calE.h代码:
1 #include "calG.h" 2 3 #ifndef calE_h 4 #define calE_h 5 6 typedef (*ptrfCal)(int, int); 7 ptrfCal selCal(char ch) 8 ptrfCal cal = NULL; 9 switch(ch) 10 case ‘+‘: 11 cal = add; 12 break; 13 case ‘-‘: 14 cal = sub; 15 break; 16 case ‘*‘: 17 cal = mul; 18 break; 19 case ‘/‘: 20 cal = div; 21 break; 22 case ‘%‘: 23 cal = mod; 24 break; 25 default: 26 printf("please select in ‘+ - * / % ‘\n"); 27 28 29 return cal; 30 31 32 #endif
calG.h代码:
1 #ifndef calG_h 2 #define calG_h 3 4 int add(int, int); 5 int sub(int, int); 6 int mul(int, int); 7 int div(int, int); 8 int mod(int, int); 9 10 #endif
calG.c代码:
1 #include "calG.h" 2 3 int add(int var1, int var2) 4 return var1 + var2; 5 6 7 int sub(int var1, int var2) 8 return var1 - var2; 9 10 11 int mul(int var1, int var2) 12 return var1 * var2; 13 14 15 int div(int var1, int var2) 16 return var1 / var2; 17 18 19 int mod(int var1, int var2) 20 return var1 % var2; 21
testc.c测试文件:
1 #include <stdio.h> 2 #include "calG.h" 3 #include "calE.h" 4 5 int main(int argc, char **argv) 6 7 printf("please input var1: "); 8 int var1; 9 scanf("%d", &var1); 10 printf("please input calSel: "); 11 char ch; 12 int tmp = getchar(); 13 scanf("%c", &ch); 14 printf("please input var2: "); 15 int var2; 16 scanf("%d", &var2); 17 18 ptrfCal cal = selCal(ch); 19 printf("%d %c %d = %d\n", var1, ch, var2, cal(var1, var2)); 20 21 return 0; 22
Makefile文件:有了头文件,还有实现文件,还有测试文件,还要啥自行车,还是需要make文件的,万一哪天想更懒惰些呢。
1 testc:testc.o calG.o 2 gcc testc.o calG.o -o testc 3 4 clean: 5 rm testc testc.o calG.o
准备工作到此为止,本来以为就是执行:
make
之后就是万事大吉,结果有一条警告出现了,意思是说声明ptrfCal是错误的int
cc -c -o testc.o testc.c In file included from testc.c:3: calE.h:6:11: warning: type defaults to ‘int’ in declaration of ‘ptrfCal’ [-Wimplicit-int] typedef (*ptrfCal)(int, int); ^~~~~~~ cc -c -o calG.o calG.c gcc testc.o calG.o -o testc
pi ~ WorkM cCode 20191004 ./testc please input var1: 10 please input calSel: + please input var2: 5 10 + 5 = 15
程序的测试结果现实也没有问题,但是,我知道编译器的警告有时比错误还需要重视,因此,决定追究一下,原来是calE.h中的函数指针定义时,忘了写返回类型,修改成:
1 #include "calG.h" 2 3 #ifndef calE_h 4 #define calE_h 5 6 typedef int (*ptrfCal)(int, int); 7 ptrfCal selCal(char ch) 8 ptrfCal cal = NULL; 9 switch(ch) 10 case ‘+‘: 11 cal = add; 12 break; 13 case ‘-‘: 14 cal = sub; 15 break; 16 case ‘*‘: 17 cal = mul; 18 break; 19 case ‘/‘: 20 cal = div; 21 break; 22 case ‘%‘: 23 cal = mod; 24 break; 25 default: 26 printf("please select in ‘+ - * / % ‘\n"); 27 28 29 return cal; 30 31 32 #endif
修改了第6行的代码,再次编译,没有警告了:
pi ~ WorkM cCode 20191004 make clean rm testc testc.o calG.o pi ~ WorkM cCode 20191004 make cc -c -o testc.o testc.c cc -c -o calG.o calG.c gcc testc.o calG.o -o testc
完美,成功了,收工,我一直觉得警告没有多大用处,很多c语言老师也告诉同学们,不要管警告,关注错误即可,实际上也不要轻易放过警告,除非你自己非常清楚怎么产生的警告,否则还是老实地把警告消除再继续下去吧。
以上是关于记录一次奇怪但是很有意义的程序编译警告的主要内容,如果未能解决你的问题,请参考以下文章
Apache Derby 为我用有意义的名称创建的索引提供了奇怪的名称