Я играю с этим последние 2 часа. Это должно быть просто, но это не сработает. Я не очень хорошо знаком с макросами, и я никогда не использовал их из-за их известной нестабильности. Но в этом случае... Я не вижу другого лучшего способа не использовать память чипа.
Я хочу не использовать память на чипе для этого, поэтому я выбираю директивы прекомпилятора, особенно макросы. Макрос просто должен определить материал, а не возвращать что-либо. Я хочу, чтобы этот макрос был эквивалентен этому коду:
#define PIN3 = 13;
#define PINLED = 13;
И это должно получиться так:
P(13,LED);
Таким образом, я могу ссылаться на PINLED в своем коде и получить ошибку компилятора, если какая-либо другая библиотека или код, который я использую, использует PIN13, когда я помещаю P (13, LED) в верхнюю часть всех файлов, которые используют этот вывод в моем проект. Я хочу что-то, что называет все контакты одинаково.
Я хочу, чтобы 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 для сборки, потому что я не могу жить с IDE arduino, который является чистым дерьмом по сравнению с другими IDE.
Извините, но ваш вопрос вряд ли понятен. Вы говорите, что хотите проверить, был ли штырь уже использован в другой части проекта, и в то же время вы показываете код для определения макросов в макросах.
Но что там, где больно, как показал @graben, его просто невозможно достичь в C. Прежде всего, оба ваших синтаксиса ошибочны:
#define P(no_,name_) PIN##name_ = no_
вы не создаете имя макроса PINLED
которому вы назначили 13
, но вы назначаете переменной C PINLED
значение 13
. Чтобы сделать ваш макрос определения PIN-кода, вам нужно использовать переменные const int
, которые обычно легко оптимизируются компилятором.
Теперь, чтобы достичь цели, которую вы говорите, чего хотите достичь, я думаю, что очень маловероятно, что вы можете сделать это в коде макропроцессора, по крайней мере, элегантным способом...
И я не думаю, что это даже необходимо!
Если вы хорошо проектируете свои библиотеки, вам не следует использовать число контактов в вашем коде и библиотеках, но создавайте их так, чтобы вы определяли значки для каждой библиотеки на этапе инициализации библиотеки. Вот почему обычно библиотеки Arduino работают в три этапа:
.begin()
)так что в основном, если у вас есть все ваши контакты, определенные в одном файле, вы не должны запускать повторное использование контактов в другом месте вашего кода.