记录一次奇怪但是很有意义的程序编译警告

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 ‘intin 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语言老师也告诉同学们,不要管警告,关注错误即可,实际上也不要轻易放过警告,除非你自己非常清楚怎么产生的警告,否则还是老实地把警告消除再继续下去吧。

 

以上是关于记录一次奇怪但是很有意义的程序编译警告的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4 - 如何获得有意义的错误

在 iOS 上同时下载多少是有意义的

Apache Derby 为我用有意义的名称创建的索引提供了奇怪的名称

Python中批量修改变量名太费劲?Pycharm中使用重命名一次搞定

2016-个人总结

2021—很有意义的一年