【发布时间】:2015-09-23 11:31:45
【问题描述】:
我想问你为什么在下面的代码中编译器没有报错? 这是 flash.h 文件:
#ifndef _FLASH_H_
#define _FLASH_H_
#define BANK_A 0
#define BANK_B 1
#define BANK_C 3
#define FLASH_IS_BUSY (FCTL3 & BUSY)//FCTL3 and BUSY are defined in msp430f5438a.
#endif
这是 main.c 文件:
#include "flash.h"
#include <msp430f5438a.h>
void main(void)
{
while(1)
{
;
}
}
问题是我不明白编译器如何在这一行没有给出错误:
#define FLASH_IS_BUSY (FCTL3 & BUSY)
由于没有办法(根据我的掌握)编译器知道 FCTL3 和 BUSY 是什么意思。这两个宏在 msp430f5438a.h 中定义如下:
#define FCTL3 (*((unsigned char*)0x0144u))
#define BUSY 0x01
但 flash.h 包含在 msp430f5438a.h 之前编译器如何解析这些符号:FCTL3 和 BUSY?
【问题讨论】:
-
宏在解析时间/之前被替换。所以理论上编译器看不到
FCTL3和BUSY -
编译器不能警告所有(甚至大多数)可能的错误。阅读Rice's theorem和Halting problem
标签: c compiler-errors macros preprocessor-directive