Экспорт константных макросов в виде значений 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

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