Избегайте указателей и #defines при программировании в Arduino? - PullRequest
2 голосов
/ 08 сентября 2011

Я просматривал StyleGuide для Arduino, когда заметил, что в разделе Commenting your Code рекомендуется избегать использования указателей и # define.

Есть ли причина, по которой автор сказал это? Нет объяснения, почему он / она это сказал. Это не имеет смысла для меня. Это что-то особенное для встраиваемых систем?

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

Я не знаю конкретной причины, по которой автор написал ее, и я не знаком со стилем написания библиотеки - поэтому я собираюсь ответить в общих чертах на программы на C ++.

Я предполагаю предпочтениедано потому, что современный C ++ обычно предпочитает другие идиомы, многие из которых были разработаны, чтобы избежать или минимизировать проблемы, часто возникающие из-за препроцессора и необработанных указателей.

Избегайте указателей

Вместоуказателя, в C ++ принято использовать ссылку на объект или контейнер, такой как вектор, для коллекции объектов.

//////// For an object
//// Using a pointer
bool getURL(t_url* const outUrl);
// In use:
bool result(obj.getURL(&outUrl));

//// versus using a reference
bool getURL(t_url& outUrl);
// In use:
bool result(obj.getURL(outUrl));

//////// For a collection
//// Using a pointer
bool apply(const double* const values, const size_t& count);
// In use:
bool result(obj.apply(array, count));

//// versus using a container
bool apply(const std::vector<double>& values);
// In use:
bool result(obj.apply(values));

Даже указателям могут быть присвоены контейнеры объектов (автоматический указатель, умныйуказатель, общий указатель, слабый указатель), поскольку при работе с необработанными указателями, особенно в клиентском коде, может быть много сложностей или двусмысленностей.Я редко пишу программы на C ++, которые принимают или возвращают необработанные указатели.

Избегать определений

Препроцессор / определения также обычно не является предпочтительным подходом в C ++ - у вас естьвстроенные функции, анонимные пространства имен, шаблоны и перечисления.

Вездесущий пример макроса, который проблематичен по многим причинам, - #define max(a,b) ((a > b) ? a : b) против std::max.

Заключение

Если я вижу программу на C ++, в которой используется значительное количество этих файлов, я задаюсь вопросом, в каком десятилетии она была написана, или же автор писал на диалекте «C с некоторыми дополнительными функциями».

Другой отвечающий сказал, что "совет - это мусор".Я не согласен.Совет в Arduino просто говорит: «избегайте указателей» и «избегайте # define».Конечно, будут моменты, когда вам нужно будет использовать эти средства, но вы можете написать более понятную программу, когда используете средства языка и библиотеки, которые были предназначены для их замены (в общих чертах, они использовались неправильно или были проблематичными). избегать их использования означает использовать их экономно и только в случае необходимости, отдавая предпочтение более современным и идиоматическим альтернативам.

0 голосов
/ 08 сентября 2011

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

#define s, с другой стороны, должно частоследует избегать по ряду причин ( один два три четыре ) в пользу встроенных функций, но, опять же, во многих ситуацияхМакросы должны быть использованы и являются лучшим решением.Это зависит от вашей проблемы - будьте умны и знайте, когда их использовать, а когда нет.Не слепо избегайте их использования, потому что в некоторых часто задаваемых вопросах нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...