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

代码都很简单就是一个简单的分模块的建议计算器,不考虑实用性和健壮性,就是个上课的小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 '+ - * / % '
");
 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
", 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 '+ - * / % '
");
 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语言老师也告诉同学们,不要管警告,关注错误即可,实际上也不要轻易放过警告,除非你自己非常清楚怎么产生的警告,否则还是老实地把警告消除再继续下去吧。

原文地址:https://www.cnblogs.com/guochaoxxl/p/11622404.html