Как я могу сгенерировать определение препроцессора, используя арифметику?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу сгенерировать определение препроцессора, используя арифметику?

Сообщение Anonymous »

Я хочу динамически создавать литеральные строки препроцессора, в которых часть строки создается с помощью некоторой арифметики, например: math(x) x - 0x1234. Сгенерированные определения будут созданы макросом: get_tex_uniform_name(unit), а результаты будут теми же значениями, что и следующие определения в числовом порядке:

Код: Выделить всё

// Texture uniform naming
#define TEX_UNIFORM_BASE_NAME        "tex"
#define TEX_UNIFORM_0                TEX_UNIFORM_BASE_NAME"0"  // "tex0" and so on
#define TEX_UNIFORM_1                TEX_UNIFORM_BASE_NAME"1"
#define TEX_UNIFORM_2                TEX_UNIFORM_BASE_NAME"2"
#define TEX_UNIFORM_3                TEX_UNIFORM_BASE_NAME"3"
Я попробовал сгенерировать строку с нуля с помощью STRINGIFY (#):

Код: Выделить всё

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
// create string literal from whatever is put in
#define STRINGIFY(x) #x
#define LITERAL_STRINGIFY(x) STRINGIFY(x)
#define get_tex_uniform_name(unit) TEX_UNIFORM_BASE_NAME LITERAL_STRINGIFY(get_tex_unit_num(unit))

// Issue: result is "texunit - 0x84C0", 0x84C0 being GL_TEXTURE0
Я попробовал вставку токенов для работы с существующими определениями:

Код: Выделить всё

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
#define get_tex_uniform_name(unit) TEX_UNIFORM_ ## get_tex_unit_num(unit)

// Error: TEX_UNIFORM_get_tex_unit_num is undefined
И пытались заставить работать какую-то битовую маскировку:

Код: Выделить всё

#define TEX_UNIFORM_BASE_NAME        "tex "

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
#define get_tex_uniform_name(unit) TEX_UNIFORM_BASE_NAME & (0xffffff00 + (char)get_tex_unit_num(unit))

// Error: expression must have integral or unscoped enum type
Я знаю, что это можно сделать с помощью функций или просто используя объединенные литеральные строки, как определено в первом примере. Я не обязательно ищу причину, по которой мои примеры не работают. Я ищу способ динамического получения этих строк, и у меня возникли проблемы с использованием арифметических операций внутри макросов для создания строкового литерала.


Подробнее здесь: https://stackoverflow.com/questions/558 ... arithmetic
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как оценить 2 переменные, используя арифметику bash в выражении if с оператором AND в оболочке bash [дубликат]
    Anonymous » » в форуме Linux
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Множественное определение значения # препроцессора
    Гость » » в форуме C++
    0 Ответы
    22 Просмотры
    Последнее сообщение Гость
  • Безопасно ли это определение препроцессора C без скобок?
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Может ли компилятор Python оптимизировать целочисленную арифметику?
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Может ли компилятор Python оптимизировать целочисленную арифметику?
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»