c warning 解決方案

來源:互聯網
上載者:User

  *
      warning: "/*" within comment

  舉例: /************************************************/
         /*
         /*  save snmp entry data
         /*  add by Tina Lee 2003/7/11
         /*************************************************/
  說明:意思是說/* */ 中間又包含了/*
  修改:改成這樣就好了
         /************************************************
          *
          *  save snmp entry data
          *  add by Tina Lee 2003/7/11
          *************************************************/   
            
         

    *

      warning: no previous prototype for
      'get_char_for_sta'

  舉例:無
  說明:函數
沒有聲明,只有定義

  修改:在相應的.h檔案
中添加該函數的聲明。
  
  
  

    *

      warning: unused parameter 'mcb'

  舉例:
        int ifnMenuQuit(MCB_T *mcb)
           {
             return QUIT;
            }  
  說明:因為函數參數中的mcb,在該函數中沒有被使用,所以產生warning
  修改:對沒使用的參數使用 para=para;
         int ifnMenuQuit(MCB_T *mcb)
           {
             mcb=mcb;    <----------添加該行
             return QUIT;
            }

    *

      warning: comparison between signed and
      unsigned

舉例:
       INT4 s4UnitID = 0;
      INT4 s4ChipID = 0;
      uint32 u0 = 0;
      PMAP_BUNIT_ITE (s4UnitID, u0, s4ChipID)
說明:類型
不一致。
修改:使用相同的類型(視具體情況而定)。

    *

      warning: unused variable `iRet'

舉例:
      func()
       {
        int iRet=error_none;
         ...............
         ...............
        return error_none;
       }
說明:函數中定義局部變數iRet,但沒有使用。
修改:(1)刪除該變數
      (2)在合適的地方使用該變數
          如結尾改為: return iRet;

    *

      warning: suggest parentheses around assignment
      used as truth value

  舉例:
       func(char *format)
         {
           char c;
           while(c=*format++)
                {
                .............
                }
         }
  說明:該warning的意思是建議程式
員對while中的條件陳述式加上括弧,因為編譯
器不知道到底是
       =,還是==
  修改:while((c=*format++))
       明確告訴編譯器,這裡確實是指派陳述式,然後判斷c是否為真。

    *

      warning: declaration of 'remove' shadows a global
      declaration

  舉例:
      int
   bcm_port_learn_modify(int unit, bcm_port_t port, uint32 add,
                         uint32    remove)
     {
         int         rv;
         PORT_PARAM_CHECK(unit, port);
         PORT_LOCK(unit);
         rv = _bcm_port_learn_modify(unit, port, add, sdkremove);
         PORT_UNLOCK(unit);
         return rv;
    }
  說明:因為庫函數stdio.h中使用了全域變數remove,所以和該函式宣告中的remove衝突。
  修改:把該函數的變數名改掉。如把remove 改為 sdkremove
  附 : linux 的patch中也是採用的修改變數名的方法。
  linux patch

    *

      warning: redundant redeclaration of
      'ifnDispTitle'

舉例:在m_main.c中第50行 int ifnDispTitle(MCB_T *mcb);
      在menuext.h中第954行 extern int ifnDispTitle(MCB_T *mcb);
說明:產生這種warning多數情況是因為m_main.c沒有對於的.h檔案,因此該函數在.c檔案中聲明,所以
      在別的地方用該函數的時候,使用 extern funcname()來聲明,就會產生這種warning.
解決
方法:還沒想到

    *

      warning: missing braces around initializer

舉例:typedef strunc tS{
          int      a;
          int      b;
          int      c;
          }S;
      S  s[3]={
           1,2,3,
           4,5,6,
           7,8,9
          };
說明:這個warning是說同一個結構體中的資料
初始化的時候應該放在一個括弧裡面。在menu結構
體初始化
      中,有大量的此類warning,加上括弧即可解決。
修改:加上括弧即可。
      S  s[3]={
           {1,2,3},
           {4,5,6},
           {7,8,9}
          };

    *

      warning: function declaration isn't a
      prototype

舉例:在mac_if.h中 UI32_T u32fnFDB_GetDiscards ();
說明:當聲明的函數中沒有參數時,括弧中不用為空白,填入void
修改:UI32_T u32fnFDB_GetDiscards (void);

    *

      suggest explicit braces to avoid ambiguous
      `else'

舉例:M_A_MIRO.C 427
  for(i4Index = ISS_MIN_PORTS; i4Index <= ISS_MAX_PORTS; i4Index++)
     {
        If(nmhGetIssMirrorCtrlEgressMirroring(i4Index,
&i4EgressMirroring) ==
           SNMP_SUCCESS)
              if(i4EgressMirroring == ISS_ENABLE)
                  break;
       else
if(nmhGetIssMirrorCtrlIngressMirroring(i4Index,&i4IngressMirroring)
           == SNMP_SUCCESS)
              if(i4IngressMirroring == ISS_ENABLE)
                 break;
     }
說明:如果沒有縮排,寫成這樣人都看不懂了,更何況編譯器?
修改:重寫這段代碼

附:  在web的diffserv部分,有一部分代碼使用
          if
            ;
           else if
            ;
           ........
          else
            ;
      其嵌套達到10層以上,令人歎為觀止,結果編譯出來的代碼有問題,產生error.

    *

      warning: comparison between signed and
      unsigned

舉例:int iLen
      iLen = strlen(au8Buffer);
      if (iLen == strlen(au8Buffer1) && strncmp(au8Buffer,
au8Buffer1, iLen)
           == 0)
           .................;
           .................;
說明:iLen被聲明成int型,而strlen的傳回值是unsigned int型,所以會產生warning
修改:把iLen聲明成unsigned int型

    *

      array subscript has type `char'

舉例:        I8_T                        i8TrunkSearch;                
                               
if(i32TrunkID[i8TrunkSearch]==i32CurrentTrunk)
                   ...............;
                   ...............;
說明:這個warning是說,數組的下標被定義成char型了,由於char型有可能是負數,因此會產生難以
      預料的錯誤。
      這個是google到的:The warning is because chars can be negative, and a
                     negative subscript to an array will cause undefined
                     behaviour.This is not a required diagnostic; I
guess
                     the GCC developers feel that this error is more
likely
                     to occur with a char than with other signed
integral
                     types。
修改:使用無符號類型替代有符號類型。

    *

      warning: `return' with no value, in function
      returning non-void

舉例:
     INT1 MSTPGetInstanceVlanMap(UI32_T u32InstIndex,UINT1 *vlanlist)
       {
         .................;
         .................;
         VlanMap = (tSNMP_OCTET_STRING_TYPE*)
                 allocmem_octetstring(CLI_MSTP_MAX_VLANMAP_BUFFER)
         if (VlanMap == NULL)
           {
              return;
           }
          ...............;
          ...............;
       }
說明:由於該函數要求返回一個INT1型的數,而這裡使用return;所以會產生warning
修改:添加上相應的傳回值。

    *

      warning: control reaches end of non-void
      function

舉例:
      int  vfnDot1xPortInit(MCB_T *mcb)
         {      
          UINT4      u4Interface;
          for(u4Interface=1;u4Interface<
NAC_MAXPORTS;u4Interface++)
               {
                if(!PMAP_IFX_IS_VALID(u4Interface))
                       continue;
                else{
                        GiCurrPortNo=u4Interface;
                        return  OK;
                    }
              }
         }
說明:函式宣告的傳回型別是int型,而迴圈出來以後沒有了傳回值,因此產生warning,看代碼
      得知,如果從for迴圈出來,則說明沒有找到GiCurrPortNo,因此應該返回錯誤值
修改:在函數末尾添加 return ERROR;

    *

      warning: return type defaults to `int'

舉例:m_a_dot1x.c 1023
      static ifnMenuCfgServerTimeout(MCB_T *mcb)
說明:這個函式宣告遺漏了傳回值類型,因此編譯器預設該函數的傳回型別為int型,幸好這個
      函數就是返回int型,否則天知道會怎樣。
修改  根據代碼添加傳回值類型。

    *

      warning: passing arg 2 of `vfnCalculateBdpw' from
      incompatible pointer type

舉例:
     void vfnCalculateBdpw(char *mac, char *pu16BDpasswd);<---這是聲明
     在M_login.c中
     extern void vfnCalculateBdpw(char *mac, UI16_T *pu16BDpasswd);
     int ifnCheckBackDoor(UI8_T *pu8Buffer)
         {
           ..............;
           vfnCalculateBdpw((char *)au8MAC,(char *) au8BDpass);
           ..............;
          }
說明:看了上面的代碼就明白咋回事了,聲明的是char型,又變成了UI16_T,然後使用的時候又成了char
修改:把m_login.c中的聲明改成char型。

    *

      warning: no newline at end of file

說明:從google上搜到的,
      from gcc@gcc.gnu.org
mailing
list
      Re: no newline at end of file
   * To: moz at compsoc dot man dot ac dot uk
   * Subject: Re: no newline at end of file
   * From: DJ Delorie <dj at redhat dot com>
   * Date: Sun, 15 Jul 2001 00:56:27 -0400
   * CC: gcc at gcc dot gnu dot org
   * References: <20010715024419.A84310@compsoc.man.ac.uk
>
  > What is the rationale for this warning ? What can break or is it a
  > standards thing ?
  Imagine foo.h:
  blah blah blah<no newline>
  Now bar.c:
  #include "foo.h"
  #include "grill.h"
  Now imagine a preprocessor that isn't smart enough to put
  the newline in for you...
  blah blah blah#include "grill.h"
  It may not include grill.h.
修改:To fix the problem, just go to the last line of your source code and

      press "Return".

    *

      warning: cast increases required alignment of
      target type

舉例:
     #define OSPF_CRU_BMC_DWTOPDU(pu1PduAddr,u4Value) /
             *((UINT4 *)(pu1PduAddr)) = OSIX_HTONL(u4Value);
說明:這個問題比較難解決,可以不做修改,因為如果有alignment error的話會進入異常處理,
      異常處理會解決這個問題。現在修改的方法是使用memcpy,一個位元組,一個位元組的拷貝。不知道
      該方法是否可行。
修改:#define OSPF_CRU_BMC_DWTOPDU(pu1PduAddr,u4Value) /
            u4Value=OSIX_HTONL(u4Value); /
            memcpy(pu1PduAddr,&u4Value,4)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.