Проверьте определение макроса, используя строки - PullRequest
0 голосов
/ 27 декабря 2011

Я не уверен, могут ли макросы использоваться таким образом.

В моем проекте по встроенным системам я хотел бы знать, определен макрос или нет в зависимости от двух строк, которые у меня есть.

Например:

#define FAN_1 PORTAbits.RA0

#define LIGHT_1 PORTAbits.RA1

Теперь, когда я получаю запрос в виде:

char *arg1="FAN"; ("LIGHT")

char *arg2="1";

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

Мне нужен способ, чтобы мне не приходилось проверять arg1 и arg2 с помощью strcmp () или прямого соответствия. И я могу прямо написать if(some_macro(arg1,arg2)==1){} else {}.

Пожалуйста, укажите, возможно ли это с помощью макросов, потому что выводы могут быть определены только так.

Кроме того, если нет, то есть ли другой способ сделать это?

Ответы [ 3 ]

4 голосов
/ 27 декабря 2011

Нет, макросы не могут использоваться таким образом.Макросы - это функция препроцессора, которая расширяется препроцессором до компиляции кода.Похоже, что запросы, которые вы получаете, известны только во время выполнения.Невозможно проверить, является ли запрос для FAN_1 или LIGHT_1 во время препроцессора, если эта информация известна только во время выполнения.Вам необходимо использовать условные проверки, чтобы определить, для чего предназначен запрос.

В зависимости от названий банков выводов («FAN», «LIGHT» и т. Д.) Может быть достаточно включить толькопервый символ arg1 или, возможно, первые несколько символов.Кроме того, вместо полного разбора arg2 в целое число, вы также можете включить символы этого.Это позволит вам идентифицировать запрашиваемый пин-код без необходимости звонить strcmp() или atoi().

1 голос
/ 27 декабря 2011

C препроцессор не имеет доступа к значениям каких-либо переменных. Но вы можете использовать переменные окружения вместо макросов:

putenv("FAN_1", "PORTAbits.RA0")
putenv("LIGHT_1", "PORTAbits.RA1")

А потом:

if (getenv(construct(arg1, arg2)) != NULL) {} else {}

Где функция construct(arg1, arg2) возвращает объединение строк arg1, "_" и arg2.

0 голосов
/ 12 января 2012

GCC поддерживает строковое форматирование макроса: 3.4 Стрификация

...