zoukankan      html  css  js  c++  java
  • 记录一次奇怪但是很有意义的程序编译警告

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

  • 相关阅读:
    vite的使用
    webpack--Plugin
    webpack--loader
    uniapp 或小程序,通过蓝牙连接设备, 给设备配网
    每一项与之前一项相加
    vue使用vue-fullpage
    React基礎
    无间隙循环轮播效果
    Wow.js动画效果
    正则表达式
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/11622404.html
Copyright © 2011-2022 走看看