Я играл с этим в течение последних 2 часов. Это должно быть просто, но это не работает. Я не очень знаком с макросами и никогда не использовал их из-за их известной нестабильности. Но в этом случае … я не вижу другого лучшего способа не использовать какую-либо микросхему памяти.
Я не хочу использовать для этого память на чипе, поэтому я выбираю директивы прекомпилятора, особенно макросы. Макрос просто должен определять вещи, а не возвращать ничего. Я хочу, чтобы этот макрос был эквивалентен этому коду:
#define PIN3 = 13;
#define PINLED = 13;
И это должно называться так:
P(13,LED);
Таким образом, я могу ссылаться на PINLED в своем коде и получать ошибку компилятора, если какая-либо другая библиотека или код, который я использую, использует PIN13, когда я помещаю P (13, светодиод) в верхнюю часть всех файлов, которые используют этот вывод в моем проект. Я хочу что-то, что называет все контакты одинаково.
Я хочу, чтобы 2 константы / определения были «определены», чтобы PIN13 вызывал ошибку компилятора, но PINLED может называться по-разному во многих проектах
Я попробовал это:
#define P(no_,name_) \
if (true) { \
PIN##name_ = no_; \
PIN##no_ = no_; \
}\
else true
Это работает, но только 1 определяет вместо 2:
#define P(no_,name_) PIN##name_ = no_
Это было предложено многими как правильный синтаксис. Я также попытался использовать синтаксис do … while (0) и другие приемы, чтобы я мог использовать макрос как функцию с; после этого но не работает и всегда выдает какую-то ошибку.
Я использую проект Ino для сборки, потому что я не могу жить с Arduino IDE, которая является просто дерьмом по сравнению с другими IDE.
Извините, но ваш вопрос вряд ли понятен. Вы говорите, что хотите проверить, не был ли пин уже использован в другой части проекта, и в то же время вы показываете код для определения макросов в макросах.
Но это то, что причиняет боль, как показывал @graben, это просто невозможно сделать в C. Прежде всего, оба ваших синтаксиса неверны:
#define P(no_,name_) PIN##name_ = no_
вы не создаете имя макроса PINLED
на которую вы назначаете 13
, но вы присваиваете переменную C PINLED
Значение 13
, Чтобы ваш макрос определения ПИН работал, вам нужно использовать const int
переменные, которые обычно легко оптимизируются компилятором.
Теперь, чтобы достичь цели, о которой вы говорите, что вы хотите достичь, я думаю, что очень маловероятно, что вы сможете сделать это в коде макропроцессора, по крайней мере, элегантно …
И я не думаю, что это даже необходимо!
Если вы хорошо проектируете свои библиотеки, вам не следует использовать номер булавки во всем коде и библиотеках, а разрабатывать их так, чтобы вы определяли булавки для каждой библиотеки на этапе инициализации библиотеки. Вот почему библиотеки Arduino обычно работают в три этапа:
.begin()
метод)в общем, если все ваши выводы определены в одном и том же файле, вы не должны сталкиваться с повторным использованием контактов в других местах вашего кода.
Других решений пока нет …