Это происходит из-за того что вы не подключаете заголовочный файлы (include), необходимые во вновь создаваемом файле.
Нет, с этим все нормально. Каждый модуль это отдельное творение, имеющее свой собственный хедер. И в данном случае в 3-ем модуле подключаю, хедеры от двух других.
Цитата:
Только необходимо, чтобы данный заголовочный файл обрабатывался один раз: #ifndef TEST_H #define TEST_H
Это тоже не обсуждается и не влияет на порядок файлов!!
Цитата:
Т.е. в вашем случае правильнее было сказать "порядок подключения заголовочных файлов", насколько я понял из последующей фразы.
Да.
Цитата:
-модуль здорового человека первой директивой #include должен подключать свой собственный .h-файл. Это минимизирует зависимость от контекста включения последнего в других модулях проекта.
Само собой!!мой наставник по Си говорил мне про это)))
В обоих подключается "ILI9341.h" может ли это как-то влиять?
Если header guard-ы (#ifndef/#define/#endif) прописаны то препроцессор вставит содержимое лишь при первом включении - для этого они и существуют. Если файлы включают друг друга - или напрямую или через третьи файлы - то "курица-яйцо" с вариантами и горе если первому нужно знать что-то из второго. а второму - из первого. Нарисуйте на листике граф #include-ов проекта, заметьте в каком месте ошибка, а в каком то определение, "невидимость" которого её вызывает. Сравните с выхлопом препроцессора. Но лучше потратить это время на рефакторинг проекта и сокращение количества связей между модулями.
_________________ Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR!
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
я в дефайнах никогда не ставлю точку с запятой т.к. дефайн может оказаться не всей командой, а только её частью, да даже если всей - то после неё в коде всёравно стоит точка с запятой. ещё поддефайновое выражение часто заключают в скобки - тоже помогает не награблиться.
Добавлено after 3 minutes 4 seconds: пример (правда не очень яркий): if (условие) дефайн_1 else дефайн_2;
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Странная просьба. Эти "гадости" сплошь и рядом на форумах встречаются. Например :
Код:
#define DATA_PORT PORTA ;
А потом пытаются что-то записать :
Код:
DATA_PORT = xxx;
И ломают голову об ругань компилятора.
pokk писал(а):
Все время в define ставлю точку с запятой
Это у Вас, по всей видимости, ещё мало опыта. Потом уйдёт от Вас эта привычка. И от точки запятой откажитесь, и do{}while(0) будете ставить в дефайны, ...
Я тут на хабре наткнулся на извращенческое программирование на Си...
Код:
int Ox01 = ~-~-~-~-~-~-~-~-~-' '; int Ox02 = ((!true)["true"]-(false)["FALSE"])>>true; int Ox03 = 'X'/2/2^!*""; int Ox04 = ('0'>>!*"")-!*""; int Ox05 = (~'!'-~'~')>>!*"">>(2==1==0); int Ox06 = ('|'||'|'|'|')["||||||||"]%*"error"; int Ox07 = '.'>>!false; int Ox08 = '\\'>>('!'>>(1<<2)); int Ox09 = '/'-'/'/'/'>>'/'/'/'; int Ox0a = (*"")["yes"]^(*"")["no"]; int Ox0b = *"yes"^*"no"; int Ox0c = '0'/2-!*""; int Ox0d = ((!'!'+'+')>>true)+(true<<true); int Ox0e = (-~true^!false)*(true<<(-~true|!false))-!false; int Ox0f = '!'-'^'%*"*"; int Ox10 = -~*" L"^-~*"5Z"; int Ox11 = *"Totally" -* "not" +* "0x17" + true; int Ox12 = -~!*""*-~!*""*-~!*""*-~!*""*-~!*""+~!*""*-~!*""*-~!*""-true; int Ox13 = -compl(-compl true xor true)<<-compl true|'8'>>('1'^'2'); int Ox14 = '^'>>('<'^'>'); int Ox15 = *"'"-(' '>>!0); int Ox16 = '_'>>-~1; int Ox17 = 010-001+010+010;
каждая из вышеописанных переменных имеет значение 0x17 это на само деле так. но блин!!!! я не понимаю... первый способ получения этого значения я осилил: операции побитовой инверсии вкупе с изменением знака каждый раз отнимают 1 от исходного числа "пробел", т.е. кода этого символа... 9 попарных сочетаний этих операций и дает нужное число.
ну последний вариант тоже очевиден - восьмеричная система счисления...
но вот дальше следуют варианты, от которых пока просто оторопь... можно попросить знатоков Си последовательно, пример за примером, объяснить, как оно работает?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
после разжёвывания становится всё просто в очередной раз я купился на то, что квадратные скобки для индексации массива можно ставить чуть ли не произвольно.
выходит, что str[0] == 0[str]
манипуляции с математикой более-менее понятны, нежели вот это
Код:
int Ox0a = (*"")["yes"]^(*"")["no"];
что такое (*"") - ?!
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: maxlab и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения