Объединение макросов целой и дробной частей в новый макрос или двойник во время компиляции - PullRequest
2 голосов
/ 20 июня 2019

У меня есть основной и вспомогательный номер версии, доступный в двух препроцессорах, определяет

#define i 123
#define f 4567

и необходимо предоставить функцию, которая возвращает их в виде двойного значения, где старшее число является целым числом, а младшее число - дробной частью.

Помимо повторения этих цифр, все решения, которые я мог придумать, довольно выразительны; см. например здесь: https://godbolt.org/z/rg3GyR

Без constexpr это получилось бы еще более выразительным, но могло бы быть и так.

В мире MS мне сошло с рук

  #define me i.f
  double df() { return me; }

но Standard C ++ не предлагает такой возможности.

Мне интересно, существует ли простой стандартный совместимый способ сделать это.

1 Ответ

4 голосов
/ 20 июня 2019

@ Комментарий Натана Оливера о точности хранения вещей как double является важным.Однако, если вы хотите продолжить, сохраняя вещи как явные double, вы можете использовать оператор вставки токенов и некоторые уровни макропересылки для явного склеивания всего вместе:

#define MAJOR 123
#define MINOR 4567

/* Two macro levels are necessary here so that the arguments MAJOR
 * and MINOR get expanded out to their true values.
 */
#define GLUE2(a, b) a##.##b
#define GLUE(a, b) GLUE2(a, b)

/* Now, VERSION is the constant 123.4567. Or at least, the closest
 * approximation of that value using a double.
 */
#define VERSION GLUE(MAJOR, MINOR)

Другие параметры, которыеможет работать лучше для вас:

  1. Создайте struct, чтобы представить вашу версию, и пусть она явно хранит поле основной и вспомогательной версии.Это наиболее «честный» способ кодирования вашей идеи.

  2. Упакуйте версию в целое число без знака (возможно, 32-разрядное или 64-разрядное), где верхняя половина целого числа являетсямажорная версия и нижняя половина - минорная версия.Это позволяет вам сравнивать версии, используя прямые целочисленные операции, но также позволяет вам делать глупые вещи, такие как умножение версий, моддинг по версиям и т. Д.

  3. Используйте строки для всего.Это позволяет хранить версии любой длины и любого уровня описания.

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