Перейти к содержанию
    

Последовательность компилирования файлов

Подскажите, как в Keil увидеть в какой последовательности компилируются файлы и почему она такая ?
 

Предположим, делаю так:

 В файле h1.h
#define CONST123 123

 В файле h2.h
  #ifndef CONST123
    #define CONST123 12345
 #endif

Потом
#include "h1.h"
#include "h2.h"

Но получаю ошибку "macro redefined" . То есть почему-то h1.h  компилируется вторым.  Хочу понять, почему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

49 minutes ago, MiklPolikov said:

h1.hex

Во-первых, при чем тут расширение hex? Это такой новый способ извращений?

Во-вторых, const - это предопределенный тип данных, встроенный язык. Очередной новый способ извращений?

В третьих, при чем тут keil?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, Forger said:

Во-первых, при чем тут расширение hex? Это такой новый способ извращений?

Во-вторых, const - это предопределенный тип данных, встроенный язык. Очередной новый способ извращений?

В третьих, при чем тут keil?

 

Опечатка
Конечно .*h
И конечно  CONST123  

Keil - ну потому что компилирую в Keil. В настройках  проекта ARM Compiler: Default 6


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У себя такой ситуации не смог повторить, препроцессор работает законно.

Чего-то Вы явно недоговариваете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, MiklPolikov said:

Keil - ну потому что компилирую в Keil. В настройках  проекта ARM Compiler: Default 6

Только что проверил в v6.19, все прекрасно компилируется.

Файл, где включил эти два инклуда, использую *.cpp

 

 

 

1 hour ago, MiklPolikov said:

#include "h1.h"
#include "h2.h"

куда вставлены эти две строчки у вас?

если не знали, компилятор (точнее препроцессор комплятора) сначала собирает все инклуды в каждом c/cpp файле в огромные файлы, а уже потом компилирует.

поэтому в каком порядке вы сделаете эти инклуды внутри другого файла, то именно в таком порядке они и будут лежать, это железно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, Arlleex said:

У себя такой ситуации не смог повторить, препроцессор работает законно.

Чего-то Вы явно недоговариваете.

Да. У меня файлов больше и проект больше.

Во всех файлах последовательность строк такая 
#include "h1.h"
#include "h2.h"

Изначальный вопрос - можно ли в Keil увидеть последовательность компилирования, и откуда она берется ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, MiklPolikov сказал:

#include "h1.h"
#include "h2.h"

Но получаю ошибку "macro redefined" . То есть почему-то h1.h  компилируется вторым.  Хочу понять, почему.

Причём тут "компиляция"? Никакой h1.h не компилируется.

#include "h1.h" - это вставка текста одного файла в другой. Вставка происходит в том порядке, в каком вы написали. И происходит до компиляции .c-файла, в который оно вставляется.

Прочтите учебник по теме: "сопроцессор си".

4 минуты назад, MiklPolikov сказал:

Изначальный вопрос - можно ли в Keil увидеть последовательность компилирования, и откуда она берется ?

Вставка #include и макроподставка не имеют никакого отношения к компиляции. Советую открыть учебник по си.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, MiklPolikov said:

Да. У меня файлов больше и проект больше.
 

Ну так разберитесь у себя в проекте, убрав оттуда "все лишнее", чтобы понять где в ВАШЕМ проекте проблема.

Тут как минимум у двоих комрадов в вашем примере нет проблем, компилятор отрабатывает на все 100.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 30.08.2023 в 16:45, jcxz сказал:

Прочтите учебник по теме: "сопроцессор си".

Препроцессор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, MiklPolikov said:

Но получаю ошибку "macro redefined" . То есть почему-то h1.h  компилируется вторым.  Хочу понять, почему.

как уже сказали он не компилируется, а include тупо вставляет содержимое, а ругается скорее всего потому, что где-то до этого делается инклюд какого-нибудь другого файла, который делает #include "h1.h"

 

https://gcc.gnu.org/onlinedocs/cppinternals/Guard-Macros.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У компилятора должен быть ключ "не стирать выходные файлы препроцессора". Изучив такой файл можно понять, какой заголовочный файл где подключился.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, Сергей Борщ said:

У компилятора должен быть ключ "не стирать выходные файлы препроцессора". Изучив такой файл можно понять, какой заголовочный файл где подключился.

Там немного не так, нужно поставить галки в свойствах проекта, чтобы эти файлы создавались на диске, иначе они просто висят в памяти компилятора и при выходе из него естественно пропадают:

 

Безымянный.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Forger сказал:

нужно поставить галки в свойствах проекта, чтобы эти файлы создавались на диске,

Да, согласен, ступил. У гцц соответствующий ключ делает то же самое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...