Директива #include
- Войдите на сайт для отправки комментариев
Чт, 15/12/2016 - 22:33
А вот скажите мне уважаемые, периодически всплывает написание этой директивы двумя образами:
#include <Wire.h> и #include "Wire.h"
и в первом и во втором случае всё компилируется и работает, а как правильно???
https://msdn.microsoft.com/ru-ru/library/36k2cdd4.as - первое, что вылезло в поисковике
"В приведенном ниже примере демонстрируется включение файлов с помощью угловых скобок:
В этом примере в исходную программу добавляется содержимое файла с именем STDIO.H. Угловые скобки указывают препроцессору, что файл STDIO.H необходимо искать сначала в каталогах, заданных в параметре компилятора /I, а затем — заданных в переменной среды INCLUDE.
В следующем примере демонстрируется включение файлов, заданных в кавычках:
В этом примере в исходную программу добавляется содержимое файла с именем DEFS.H. Кавычки означают, что препроцессор сначала попытается найти этот файл в каталоге, содержащем родительский исходный файл."
"Если подключаемый файл указан в <>, то поиск будет происходить в стандартных каталогах, предназначенных для хранения заголовочных файлов. В случае, если подключаемый файл заключен в двойные кавычки, поиск будет происходить в текущем рабочем каталоге. Если файл не найден, то поиск продолжается в стандартных каталогах."
"Различие в том, где препроцессор будет начинать поиск файла some.h. Если использовать директиву #include "some.h", то сначала будут просмотрены локальные (по отношению к проекту) папки включения файлов. Если использовать #include <some.h>, то сначала будут просматриваться глобальные (по отношению к проекту) папки включения файлов. Глобальные папки включения - это папки, прописанные в настройке среды разработки, локальные - это те, которые прописаны в настройках проекта."
как для новичка, вы написали две одинаковые вещи :D
to El.
Благодарю!
Теперь понятно куда засовывать уникальные для проекта библиотеки и как их объявлять )))
Благодарю!
Теперь понятно куда засовывать уникальные для проекта библиотеки и как их объявлять )))
достаточно именовать файлы библиотек уникальными именами.
А как организовать подключение внешних файлов через #include ?
Допустим часть кода помещается во внешний файл, назовем его IntSendCom.inc
Логично было бы поместить его в каталог с файлом .ino и написать что-то вроде
чтобы вместо строки #include "IntSendCom.inc" в данное место подставлялся текст из этого файла.
Однако облом
C:\Users\777\Documents\Arduino\sketch_jan13a\sketch_jan13a.ino:2:1: fatal error: IntSendCom.inc: No such file or directory
Если указать полный путь, то все работает
Полный путь не очень удобно. Как-нибудь еще можно сделать?
Обратите внимание на расширение файла.
Обратите внимание на расширение файла.
#include с полным путем работает с любым расширением, а не только с библиотеками.
Вам что надо-то - include сделать или свое расширение использовать?
А как организовать подключение внешних файлов через #include ?
Допустим часть кода помещается во внешний файл, назовем его IntSendCom.inc
Логично было бы поместить его в каталог с файлом .ino и написать что-то вроде
1
#include "IntSendCom.inc"
2
3
void
setup
() {
4
// put your setup code here, to run once:
5
}
6
void
loop
() {
7
// put your main code here, to run repeatedly:
8
}
чтобы вместо строки #include "IntSendCom.inc" в данное место подставлялся текст из этого файла.
При установке IDE где-то прописываются пути, по которым ищется файлы прописанные в #include <IntSendCom777.inc>
Например, если поместить файл IntSendCom777.inc в папку "C:\Users\777\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.9\system\libsam\", то #include <IntSendCom777.inc> срабатывает, файл находится.
Наверное где-то в реестре прописываются пути.
А описание слабо прочитать а не гадать и собственные хотелки озвучивать? Например https://msdn.microsoft.com/ru-ru/library/36k2cdd4.aspx
Подобная проблема обсуждалась и здесь- http://arduino.ru/forum/programmirovanie/arduino-ide-ne-vidit-faily-v-papkakh
Поэтому попробуй сначала проверить, что и как в Arduino IDE, если не слабо, конечно.
Читайте внимательно то, на что ссылаетесь.
Начиная с какого-то из релизов ветки 1.6 (на 1.6.11 - точно) все файлы, которые понимает компилятор, переносятся в во временный каталог компиляции. Даже будучи вложенными в каталоги. И прекрасно после этого инклюдятся и компилируются. Если вы решили научить Arduino IDE обрабатывать нестандартные расширения - правьте код IDE.
>Если вы решили научить Arduino IDE обрабатывать нестандартные расширения - правьте код IDE.
Если прописать полный путь, то в Arduino IDE "прекрасно после этого инклюдятся и компилируются" нестандартные расширения без всякой правки кода IDE.
Отлично, прописывайте.
Не хочу прописывать. Хочу не прописывать.
зы. В 1.6.8 вот так прокатывает
#include <..\..\inc\IntSendCom777.inc> если в папке sketchbook создать папку sketchbook\inc и положить туда IntSendCom777.inc
#include <..\IntSendCom777.inc> если IntSendCom777.inc положить в папку sketchbook\libraries
Нет, етишкин кот, не все так просто. Надо чтобы строкой выше была подключена какая-нибудь библиотека. Например так
Вот так -
зы. Проверил в последней версии 1.8.5 - картина та же самая.
То есть можно инклюдить произвольные файлы с относительным путем.
То есть можно инклюдить произвольные файлы с относительным путем.
не страдайте идиотизмом. Существует простой способ добавления файлов в проект. Если вы хотите положить часть кода (кода на С/ C++!) в оотдельный файл, расширение у него должно быть .c .cpp или .h. Это не прихоть создателей ардуино - это стандарт языка.
То есть можно инклюдить произвольные файлы с относительным путем.
не страдайте идиотизмом. Существует простой способ добавления файлов в проект. Если вы хотите положить часть кода (кода на С/ C++!) в оотдельный файл, расширение у него должно быть .c .cpp или .h. Это не прихоть создателей ардуино - это стандарт языка.
Пример работающего кода пришлите, плз.
Не работает - sketch_jan15a.ino:1:19: fatal error: add.cpp: No such file or directory
прежде чем писать "не работает", может стоит прочитать хотя бы ту ветку, в который вы это пишете? - обратите особое внимание на сообщения #1 и #2
Прежде чем давать идиотские советы, неплохо бы самому задуматься на тем что пишешь.
> Существует простой способ добавления файлов в проект. Если вы хотите положить часть кода (кода на С/ C++!) в оотдельный файл, расширение у него должно быть .c .cpp или .h. Это не прихоть создателей ардуино - это стандарт языка.
Это кто писал?
.Это кто писал?
Вы мне не тыкайте. Судя по задаваемым вопросам. ваш уровень в программировании - нулевой. А судя по последнему сообщению, вы и читать не умеете.
Прочитайте сообщения #1 #2 ветки. Чтобы превратить ваш пример в работающий - нужно изменить 2 (два) символа. Найдите их сами - это, так сказать, тест на интеллект. Если не пройдете - не вижу смысла в дальнейшем общении, я не люблю общаться с тупицами.
Поменьше апломба, умник.
Еще предложения?
sketch_jan15a.ino:2:17: fatal error: add.h: No such file or directory
Возьми сам и попробуй, прежде чем писать. lol
Заодно перечитай
https://msdn.microsoft.com/ru-ru/library/36k2cdd4.aspx
и найди там упоминания о "стандартных расширениях" .h, .cpp и прочем.
зы. на форумах стандартно обращение на ты. На вы - опционально, или Вы - когда уж до мордобоя доходит.
Возьми сам и попробуй, прежде чем писать. lol
Основной код
Подключаемый файл:
Компилируется, ошибок нет.
ЗЫ: Код мой, с этого же форума, к вопросу отношения не имеет.
Ну хоспади, боже, это понятно что библиотеки подключаются без проблем.
Я ж чо пишу, русским по белому, в сообщении #6
>А как организовать подключение внешних файлов через #include ?
>Допустим часть кода помещается во внешний файл, назовем его IntSendCom.inc
>Логично было бы поместить его в каталог с файлом .ino и написать что-то вроде
>#include "IntSendCom.inc"
>чтобы вместо строки #include "IntSendCom.inc" в данное место подставлялся текст из этого файла.
>Если указать полный путь, то все работает
Проблема с относительным путем, но путем шаманства она как-то решилась.
Ну хоспади, боже, это понятно что библиотеки подключаются без проблем.
в чем вопрос-то тогда? Файл Task.h в моем примере - это не "библиотека", это часть моего кода. который я поместил в другой файл. Ровно то, что вы хотели. Проблема ваша только в том, что вы хотите своим подключаемым файлам давать нестандартные расширения.
Тут два пути:
- либо делать как все - .c .cpp .h
- либо править исходники IDE
Второе, как мне кажется по дискуссии - вам недоступно. Так что не привередничайте, пользуйтесь стандартным методом.
> Файл Task.h в моем примере - это не "библиотека", это часть моего кода. который я поместил в другой файл.
Продолжение марлезонского балета
sketch_jan15a.ino:2:18: fatal error: task.h: No such file or directory
Где у тебя находится task.h, в какой папке?
Где у тебя находится task.h, в какой папке?
в той же, где скетч
А версия Arduino IDE какая?
Кириллических символов в пути к скетчу - лучче не надо.
Там нет кириллических символов.
зы. Вроде как на версиях младше 1.6.9 include таким способом работает.
версия Arduino IDE какая?
1.8.2
Вы там, наверно, в регистре уже покопались, пока файлы .inc пытались запустить - вот и не работает.
Подключение внешних файлов даже смешно обсуждать - зайдите в раздел "Проекты", там мимнимум половина поделок используют разбиение кода на несколько файлов и никаких проблем это не вызывает. Если у вас не работает - проблема в вас или в вашем компе.
>Вы там, наверно, в регистре уже покопались,
Телепаты на марше.
Ладно, свою проблему я решил, переливать дальше смысла нет.
>Вы там, наверно, в регистре уже покопались,
Телепаты на марше.
Ладно, свою проблему я решил, переливать дальше смысла нет.
не по делу - интересно. сколько вам лет? Вы на любые замечания реагируете, словно подросток 15-летний...
Это вообще признак неуверенности в себе - так взрываться по любому поводу. Сами в глубине души знаете, что не тянете, а показать стыдно.
И это говорит человек, который пишет "не страдайте идиотизмом", "ваш уровень в программировании - нулевой", "тупица" и при этом требует обращения на вы. )))
Одни понты...
Diakin, поспокойнее, а то ведь и нахер послать могут - тут борзых не очень любят, так уж повелось.
Да я и сам могу послать, борзых-то..
И это говорит человек, который пишет "не страдайте идиотизмом", "ваш уровень в программировании - нулевой", "тупица" и при этом требует обращения на вы. )))
"не страдайте" и правда было резковато. а дальше совершенно по делу.
Вот здесь проект где пару десятков подключаемых файлов
Файлы со стандартными расширениями можно и не инклюдить, они и так подхватываются.
Но в закладках появляются через раз. Но даже есди в закладках не появляются, то они компилятся, да.
Но даже если и добавить include, все равно порядок компиляции файлов не зависит от того, в какой последовательностьи #include вставлены в исходник. Порядок компиляции зависит от имени файлов.
Поэтому это не совсем, то что надо.
Но в закладках появляются через раз.
Поэтому это не совсем, то что надо.
Что там у вас творится - одному богу известно. Всё прекрасно появляется/компилится, вот пруф из рабочего проекта, можно посчитать, сколько файлов валяется рядом с *.ino: https://github.com/Porokhnya/GreenhouseProject/tree/master/Main
diakin - Поставьте с нуля Ардуино ИДЕ на пустом компе, где ардуино еще не было. Просто ради теста - например на работе. И проверьте, как будут работать инклюды. У вас сейчас явно "сломана" ИДЕ.
Установлена и на работе и дома. Разные версии 1.85, 1.77. Установлены и portable и полная установка.
Portable по идее должна быть полностью автономна.
Ну попробуйте у себя-то ради интереса, код минимальный.
Один файл с ошибкой
Второй доп.файл с другой ошибкой
Отрыть\закрыть скетч несколько раз, удалть\добавить доп.файлы в папку и т.п.
Без include подхватываются файлы? В какой последовательности компилируются? В закладках при каждом открытии отображаются файлы? И тд.
Несложно же.
#include "add1.cpp" - так файлы не подключают. Подключают *.h-файл, в котором объявления находятся. В *.cpp-файле - определения.
Файлы *.cpp и *.h можно не подключать через #include и они все равно будут компилироваться. По факту. Если они лежат в папке скетча.
Файлы *.cpp и *.h можно не подключать через #include и они все равно будут компилироваться. По факту. Если они лежат в папке скетча.
Так точно. Но если захотите воспользоваться интерфейсами, реализованными в *.cpp - в файле, в котором пользуются интерфейсы, надо подключить *.h-файл, содержащий их объявления.
Да он, наверное, сигарету с фильтра прикуривает.