Определение макроса для добавления префикса 0x к литералу шестнадцатеричной строки - PullRequest
2 голосов
/ 20 января 2020

Я пытаюсь заставить макрос работать в моей программе c, чтобы добавить 0x к литералу HEX следующим образом:

#define BUILD ABCD0000

#define CONCAT(m, n) m ## n
#define HEX(x) CONCAT(0x, x)

const uint32_t Id = HEX (BUILD);

Я получаю эту ошибку компилятора: неверный суффикс "x" на целочисленной константе. Кто-нибудь может помочь?

Ответы [ 2 ]

3 голосов
/ 20 января 2020

Это не тот ответ, который вы ожидаете, но мне жаль, я должен: НЕ ДЕЛАЙТЕ ЭТОГО !!

Почему бы и нет?

  • Это вводит в заблуждение: имя и синтаксис HEX(x) приводят к мысли, что он преобразует x в шестнадцатеричный формат, тогда как для этого аргумента требуется, чтобы он уже был в шестнадцатеричном виде.
  • Он ведет себя плохо: HEX(ABC00+10) будет занимать первую часть с шестнадцатеричным, но вторая часть все еще в десятичной. Чтобы позволить макросам вести себя хорошо с выражениями, хитрость заключается в том, чтобы заключить каждое использование параметра в круглые скобки, но это невозможно при конкатенации.
  • Это идет вразрез с POLA для ваших коллег-разработчиков
  • Лучше привыкнуть к 0x: он появляется в большом количестве кода там, в сообщениях компилятора, в отладчиках и т. д. c ... Так что тренируйте глаза, а не пытайтесь сбежать.

При этом после тестирования на нескольких версиях компилятора на Годболте я не смог воспроизвести вашу ошибку. Поэтому, если вы хотите go on:

  • Возможно, ваш старый компилятор нарушен пробелами (удалите все пробелы в определениях макросов и их использовании). Или не должен, но кто знает, два x в макросе для расширения?
  • Или, возможно, ваш компилятор ожидает, что каждый токен, используемый в макросе, будет действительным (например, строки должны быть закрыты, литералы действительны и т. Д. c ...). Я помню такие ограничения, но на очень старых C компиляторах в 80-х, возможно, в 90-х годах *
0 голосов
/ 21 января 2020

Это решено сейчас. Я заставил его работать на другом компиляторе, а затем понял, что он фактически генерирует пробел для значения BUILD ie просто #define BUILD

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