Хотелось бы спросить вас, почему в следующем коде компилятор не дает ошибку? Это файл 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» – Alex
Компилятор не может предупреждать всех (или даже самых) возможных ошибок. Читайте о [теореме Райса] (https://en.wikipedia.org/wiki/Rice%27s_theorem) и [проблема с остановкой] (https://en.wikipedia.org/wiki/Halting_problem) –