• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

关于预编译报错问题,求解!

SingleYork 2016-10-27 浏览量:1178
本帖最后由 SingleYork 于 2016-10-27 09:56 编辑

#if   (MCU_Type == STC15W_4K16S4)
      #define   MOVC_ShiftAddress    0x4000
#elif (MCU_Type == STC15W_4K32S4)
      #define   MOVC_ShiftAddress    0x8000
#elif (MCU_Type == STC15W_4K40S4)
      #define   MOVC_ShiftAddress    0xA000
#elif (MCU_Type == STC15W_4K48S4)
      #define   MOVC_ShiftAddress    0xC000
#elif (MCU_Type == STC15W_4K56S4)
      #define   MOVC_ShiftAddress    0xE000
                        
#elif (MCU_Type == IAP15W_4K58S4)
      #define   MOVC_ShiftAddress    0xE000 
#elif (MCU_Type == IAP15W_4K61S4)
      #define   MOVC_ShiftAddress    0xE000
#elif (MCU_Type == IAP15W_4K63S4)
      #define   MOVC_ShiftAddress    0xE000
#endif

在看刘平老师飞天三号EEPROM库函数中有这么一段代码,编译的时候总是报警,不知道是哪里有问题,是语法的问题么?或者是其他问题呢?





2 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 本帖最后由 汉云 于 2016-10-27 13:03 编辑

    你只是define 了 MCU_Type 是 IAP15W_4K58S4
    但是IAP15W_4K58S4是什么呢?定义了么?

    下面是我试的,当没有t1 t2 t3 t4这些时,使用# if会有警告,加上就没有了,


    看这个例子:

    enum weekDays{So, Mo, Tu, Wd, Th, Fr, Sa};
    #define dayOfWeek Mo

    #if dayOfWeek==Mo
    #endif
    • 发布于 2016-10-27
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:18
  • 本帖最后由 LiuYang 于 2016-10-27 10:24 编辑

    MCU_Type定义了吗?
    前面有个MCU_Type的定义,但是值是一个未定义的名称,所以会报错。
    定义的时候应该是个常量或常量名,这样就不会报错了。
    • 发布于2016-10-27
    • 举报
    • 评论 0
    • 1
    • 0

  • 本帖最后由 MOP 于 2016-10-27 22:07 编辑

    有問題的是
    #elif (MCU_Type == IAP15W_4K58S4  )
          #define   MOVC_ShiftAddress    0xE000
    其中 IAP15W_4K58S4沒有Define,如同變數x沒有宣告型別就使用,會發生此警告,但變數一定會錯誤

    您要include其他標頭檔,或者自己額外定義
    #include "xxx.h"
    附上對於此警告的官方說明和範例

    另外補充的是,如果是Keil的ARM Compiler,則以上範例都不會有任何警告和錯誤,所以要特別注意可能會不知道Bug在哪:)

    而正常arm-linux-gnueabihf-gcc Compiler的話,則會是錯誤訊息,不只是警告
    error: 'IAP15W_4K58S4' undeclared (first use in this function)



    • 发布于2016-10-27
    • 举报
    • 评论 0
    • 1
    • 0

  • 你是不是定义的时候打错了字
    • 发布于2016-10-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 编译的时候找不到这个变量在哪,比如你头文件定义了一个全局变量,但是你引用头文件,但是本文件没有声明一下,也是这个提示!
    • 发布于2016-10-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这问题应该是调用这个宏的位置出现问题,而非宏定义处,你可以把宏定义改成const,这样很容易找到出错位置
    • 发布于2016-10-28
    • 举报
    • 评论 0
    • 0
    • 0

  • US 发表于 2016-10-28 12:15
    你这问题应该是调用这个宏的位置出现问题,而非宏定义处,你可以把宏定义改成const,这样很容易找到出错位 ...

    意義上const跟#define是不同的,因為一個是"唯讀變數"當作常量,一個是"預處理"常量,正確觀念是用#define
    • 发布于2016-10-28
    • 举报
    • 评论 0
    • 0
    • 0

  • MOP 发表于 2016-10-28 13:23
    那個喔,他嫌我寫太少我又補充上去,樓主知道

    补充?:D
    你当时的回答跟现在的真差很多啊,那怎么不见你之前的回复中的内容了呢?好像思路也不太一样了。
    现在的这个完全是重写的嘛~
    重写就重写吧,谁也没说什么,还非得说别人抄你的。
    也许是你自己想了想不对改的;也许是你感觉别人的对,你又改的;相信在2016-10-27 22:07之前不只一个人看过你的答案了。
    清者自清,浊者自浊。
    管理员是可以回档的。
    • 发布于2016-10-28
    • 举报
    • 评论 0
    • 0
    • 0


  • 這我一開始的版本,我跟直接樓主討論的,所以我補充一些且寫比較清楚一點而已,若沒看清楚就批評是很不好的,不知道你要跟我吵什麼:o
    • 发布于2016-10-28
    • 举报
    • 评论 0
    • 0
    • 0

  • MOP 发表于 2016-10-28 13:29
    意義上const跟#define是不同的,因為一個是"唯讀變數"當作常量,一個是"預處理"常量,正確觀念是用#define ...

    主要是宏定义容易出错,改成const便于排错,而不是真正改
    • 发布于2016-10-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 感觉是变量重定向
    • 发布于2016-10-30
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

关于预编译报错问题,求解!