Как объединить и оценить макрос с помощью оператора ## - PullRequest
0 голосов
/ 16 апреля 2019

Я написал код ac вот так

#include<stdio.h>
#include<stdint.h>
#define CHAN(n) ((0x8020##4+n) ## 20)
void main()
{
     int n = any_value;
     printf("%x",CHAN(n));
}

Я получаю ошибку компиляции pasting ")" and "20" does not give a valid preprocessing token.

На самом деле я хочу оценить выражение со значением n.Итак, скажем, если я передам значение n как 1, чем я ожидаю вывод 0x8020520.Точно так же, если я передам значение n как 8, чем я ожидаю 0x8020c20.

Если я удалю ##20 из макроса, я не получу никакой ошибки компиляции и получу ожидаемую половину выводакак 0x80205 или 0x8020c Моя проблема в том, что я не могу найти способ объединить 20 после вычисления выражения, т.е. (0x8020##4+n)##20.Любая помощь будет оценена.

1 Ответ

4 голосов
/ 16 апреля 2019

Когда вы делаете (0x8020##4+n), он анализируется как эти токены: "(", "0x8020" ## "4", "+", "n", ")".

После вставки "0x8020" и "4" вы получите ( 0x80204 + n ). Это на самом деле не добавляет n перед вставкой. (А как это могло быть? Препроцессор не знает, что такое переменная, и думает, что «n» - это просто строка длиной 1)

Когда вы делаете ) ## 20, вы получаете неверный токен ") 20", который не имеет смысла. Так что это по праву выдает ошибку.

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

 #define CHAN(n) (0x8020020 | ((4 + n) << 8))
 //                     ^

(где сдвиг перемещает одну шестнадцатеричную цифру, представленную (4 + n), на второе место, и | (поразрядно или) - заменяет указанное значение 0.

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