Стандарт базовых языков?
- Войдите на сайт для отправки комментариев
Ср, 31/08/2016 - 08:43
Добрый день, подскажите на каких стандартах С++ или С базируется язык Arduino ?
При программирвание возникают пару проблем:
1)
Код типо
foo((struct Simple){.value = 1});
не компилируется
2)
Зона видимости переменных
Чтобы увидеть переменную из соседнего файла приходится применять конструкцию extern хотя переменная объявлена глобальной
1. И не должен компилироваться, ибо набор символов, а не код;
2. Всё в порядке с зонами видимости переменных, не в порядке только одно - ваше понимание этого момента.
Хинт: Arduino IDE использует gcc как компилятор. GCC - один из лучших компиляторов с С/С++.
З.Ы. Языка Arduino в природе не существует.
на каких стандартах С++ или С базируется язык Arduino ?
Языка Ардуино не существует в природе.
То, что Вы имели в виду базируется на стандарте ISO/IEC 14882:2011
Код типо
не компилируется
Компилируется он или нет зависит от версии IDE. В ранних версих разработчики перестарались с "облегчением жизни новичкам". Позже это исправили. Если интересны подробности, в чём именно перестарались, я это здесь уже много раз объяснял, например.
Впрочем, если вынести это в отдельный файл, то всё отлично компилируется в любой версии IDE. Попробуйте создать скетч с любым именем:
В ту же папку, рядом со скетчем положите два файла.
Файл кака.h
и файл kaka.cpp
запустите IDE и убедитесь, что всё компилируется нормально. Не только компилируется, но и работает.
Другое дело, для чего такой код нужен (передача структуры по значению), но мы же говорим о примере? Так вот, пример нормально компилируктся
В точности соответсвует стандарту. Некоторые реализации просто сами добавляют extern к глобальным переменным, возможно Вы такое видели и привыкли к этому, но это как раз отклонение от стандарта.
Компилируется он или нет зависит от версии IDE. В ранних версих разработчики перестарались с "облегчением жизни новичкам". Позже это исправили. Если интересны подробности, в чём именно перестарались, я это здесь уже много раз объяснял, например.
Евгений, вы же про использование неопределённого типа, я правильно понял? Просто мне показалось, что ошибка в приведённом коде не в этом, в просто в неправильном синтаксисе. Строго говоря, давненько не освежал в памяти многие моменты из стандарта, поэтому - ошибся я, получается. Спасибо за уточнение, всему виной косность - не привык я так инициализировать структуры :) Просто по порядку следования полей, в фигурных скобках - это да, частенько.
Приношу свои извинения ТС в части пункта 1 моего ответа.
Да, именно про тип. Свинство они всё же устроили.
А конструкция действительно экзотическая, чего уж там :)
ситуация такая что я дописываю чужой код, а в нем все переменные объявленные глобально видны во всех файлах (.ino), создав свой файл с глобальными переменными , у меня не получается достучаться до нужных мне переменных, все лежит в одной папке.
я понимаю что языка Arduino нет и в помине, имелось ввиду что понимает IDE. Как я понял единтсвенный выход это иметь один *ino файл для запуска скетча, а все остальное хранить в *с/*cpp и *h файлах для меньешго гемороя с IDE ?
я понимаю что языка Arduino нет и в помине, имелось ввиду что понимает IDE. Как я понял единтсвенный выход это иметь один *ino файл для запуска скетча, а все остальное хранить в *с/*cpp и *h файлах для меньешго гемороя с IDE ?
Ну, не знаю, всегда ведь есть 100500 способов что-то сделать. Делайте как Вы умеете и как Вам удобнее.
Вообще инлайновые инициализации чего-бы-то ни было - спецом созданы для порождения максимально нечитаемого кода.
Нужно использовать тогда, когда Вас собрались увольнять, но работающий код придется показать и передать другому.
Отсюда требования:
1. коментарии желательно писать в стиле "Где мы? - На воздушном шаре.", причем писать много и ставить не в те строки.
2. Никакого структурного кода, все строки с первой позиции! (исключение - Питон, там структура по синтаксису положена, к сожалению!);
3. чаще использовать перенос строки в длинной формуле
4. да! и побольше длинных формул!
5. да! и переменные инициализировать внутри этих самых длинных формул!
6. Если есть возможность использовать ()?():() - вместо if() else();
7. название переменной должно быть не длиннее трех символов. Предпочтительнее i1, i11, I95.
таким способам удобно передавать именнованные аргументы в функцию
[
я понимаю что языка Arduino нет и в помине, имелось ввиду что понимает IDE. ля меньешго гемороя с IDE ?
Простите, но ведь уже написали, что в IDE используется самый обычный GCC. Который соответствует именно стандартному С и С++.
Разбивку на файлы - можете делать как Вам угодно. Но папки/подпапки в структуре проекта пока нельзя использовать. Хотя на последних версиях не проверял еще.
вы действительно считаете что это более читаемо
чем это
?
c89, c99, c11 ? инициализация структур таким способом как я хочу появилась в стандарте с99
Да я не спорю, я же просто прикалываюсь.
В Вашем примере - хороший вариант самодокументированного кода. Мне нравится.
Я бы - по старинке - просто комментарий написал, но это дело вкуса. Ваш вариант весьма изящен.
3. чаще использовать перенос строки в длинной формуле
Чушь! Всё зависит от понимания.
4. да! и побольше длинных формул!
Чушь! На нормальных МК длинная формула чаще всего вырождается в более короткий и быстрый код.
6. Если есть возможность использовать ()?():() - вместо if() else();
Чушь! Нужно просто знать язык программирования.
c89, c99, c11 ? инициализация структур таким способом как я хочу появилась в стандарте с99
Прошу прощения за традиционное хамство, но Вас в гугле забанили?
gcc - Все таки основной компилятор С в мире. Ну в том, что не ограничен исключительно Microsoft.
http://gcc.gnu.org/c99status.html
Верю, что по аглицки читаете.
Чушь! На нормальных МК длинная формула чаще всего вырождается в более короткий и быстрый код.
Та нема базару, брателло! STM32 - форева рулез! Мега - мега-ацтой! Я согласен с тобой полностью! ;) ;) ;)
да и у gcc есть фалги типо -std=c99.
Гугл все таки помог понять что в Arduino IDE этого не сделать.
ну почему????? все флаги компилятора в среде настраиваются, не из среды, а в настроечном файле. Опять подсказывать нужно, где именно?