Экспорт константных макросов в виде значений constexpr в модуле C++20C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Экспорт константных макросов в виде значений constexpr в модуле C++20

Сообщение Anonymous »

В настоящее время я работаю с модулями C++20, чтобы модернизировать кодовую базу нашей компании.
Предположим, вы хотите написать модуль C++ для экспорта содержимого библиотеки C. который использует #define для объявления числовых или строковых констант. Например, представьте, что вы хотите создать модуль Windows со всем содержимым .
Предположим, у нас есть существующий сторонний модуль. заголовок библиотеки SuperLib.h, который содержит следующее:

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

#pragma once
struct super_lib_type {int field;};
extern void super_lib_function(int a);
#define SUPER_LIB_CONSTANT 42
Теперь напишем такой модуль C++:

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

export module SuperLib;
export
{
#include 
}
Функция super_lib_function и тип super_lib_type будут успешно экспортированы в модуль. Но, очевидно, не SUPER_LIB_CONSTANT константа, поскольку макросы по своей природе никогда не экспортируются в модули C++20.
Чтобы это исправить, было бы здорово если бы мы могли иметь эквивалент этого кода:

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

export module SuperLib;
export
{
#include 
}
#undef SUPER_LIB_CONSTANT
export constexpr auto SUPER_LIB_CONSTANT = 42;
Но без необходимости жестко закодировать значение 42 в файле модуля.
Я попытался написать для этого макрос. Вот этот вид работы:

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

#define EXPORT(name) export constexpr auto SL_##name = name;
EXPORT(SUPER_LIB_CONSTANT)
Он будет экспортировать константу SL_SUPER_LIB_CONSTANT. Но этот подход имеет неудобство, поскольку требует префикса или суффикса в имени символа. Для совместимости с существующим кодом было бы здорово, если бы экспортируемое имя было таким же, как исходное имя макроса.
Я подумал, что смогу решить проблему, разделив исходное имя макроса на две части.
Что-то в этом роде:

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

#define CONCAT(prefix,suffix) prefix##suffix
#define EXPORT(prefix,suffix) export constexpr auto CONCAT(prefix,suffix) = prefix##suffix;
EXPORT(SUPER_LIB_,CONSTANT)
Но это генерирует неверный код экспорта auto constexpr 42 = 42; после предварительной обработки.
Тем не менее, у меня такое впечатление, что это можно написать макрос с двумя аргументами для удовлетворения этой потребности. И, возможно, даже макрос с одним аргументом.

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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