Непонятная работа препроцессора

Растудайкин
Offline
Зарегистрирован: 19.05.2017

Программа №1 компилируется без ошибок

//#include "APPEND2.h"
void test_function(void);
void test_function(void){OCR2A=150;}
// если включить файл "APPEND2.h" не в конце , а в начале
// компилятор не знает что такое имя регистра
//APPEND2.h:2: error: 'OCR2A' was not declared in this scope
  void test_function(void); // прототип здесь обязателен, #include c прототипом не действует  
  void setup(void)   {   test_function(); }
  void loop(void) {}

Переносим из программы две строки в файл APPEND2.H и включаем этот файл через #include "APPEND2.H"

Компилятор перестает узнавать имя "OCR2A"

#include "APPEND2.h"
// если включить файл "APPEND2.h" не в конце , а в начале
// компилятор не знает что такое имя регистра
//APPEND2.h:2: error: 'OCR2A' was not declared in this scope
  void test_function(void); // прототип здесь обязателен, #include c прототипом не действует  
  void setup(void)   {   test_function(); }
  void loop(void) {}

Содержание файла APPEND2.H:

void test_function(void);
void test_function(void){OCR2A=150;}


Почему происходят такие препроцессорные "чудеса" ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Посмотрите, что на самом деле достаётся компилятору после предварительной обработки Вашего текста IDE - всё поймёте :)

Растудайкин
Offline
Зарегистрирован: 19.05.2017

ЕвгенийП пишет:
Посмотрите, что на самом деле достаётся компилятору после предварительной обработки Вашего текста IDE - всё поймёте :)

Как посмотреть результат работы препроцесора в IDE Arduino ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Зависит от версии IDE. 

В любом случае Вам нужно найти папку, куда он складывает временные файлы. там есть файл. <название_скетча>.ino.cpp Вот это он и есть.

Как найти папку с временными файлами ... по Вашим постам мне кажется, что Вы не вчера программировать начали - найдёте. Если проблема, то говорите версию IDE.

Растудайкин
Offline
Зарегистрирован: 19.05.2017

ЕвгенийП пишет:
Зависит от версии IDE. В любом случае Вам нужно найти папку, куда он складывает временные файлы. там есть файл. <название_скетча>.ino.cpp Вот это он и есть.

версия 1.0.5-r2 

(попытка мастерить к ней костыли здесь http://arduino.ru/forum/programmirovanie/nebolshie-kostyli-dlya-ide-duino-proshu-kritikovat-i-predlagat-bolee-udobnye )

нашел файл *.cpp

#line 1 "TEST2.ino"
#include "APPEND2.h"

//void test_function(void);
//void test_function(void){OCR2A=150;}


// \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0430\u0439\u043b "APPEND2.h" \u043d\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 , \u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435
// \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438\u043c\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430
//APPEND2.h:2: error: 'OCR2A' was not declared in this scope


  #include "Arduino.h"
void setup(void);
void loop(void);
#line 12
void test_function(void); // \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0437\u0434\u0435\u0441\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d, #include c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u043c \u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442  
  
  void setup(void)   {   test_function(); }
  void loop(void) {}

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот, видите, что arduino.h включён ПОСЛЕ Вашего файла. Теперь Вас не удивляет, что OCR1A  в Вашем файле не определён?

Включайте в Ваши include файлы arduino.h и всё будет определено