Предположим, вы хотите написать модуль 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
Код: Выделить всё
export module SuperLib;
export
{
#include
}
Чтобы это исправить, было бы здорово если бы мы могли иметь эквивалент этого кода:
Код: Выделить всё
export module SuperLib;
export
{
#include
}
#undef SUPER_LIB_CONSTANT
export constexpr auto SUPER_LIB_CONSTANT = 42;
Я попытался написать для этого макрос. Вот этот вид работы:
Код: Выделить всё
#define EXPORT(name) export constexpr auto SL_##name = name;
EXPORT(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)
Тем не менее, у меня такое впечатление, что это можно написать макрос с двумя аргументами для удовлетворения этой потребности. И, возможно, даже макрос с одним аргументом.
Подробнее здесь: https://stackoverflow.com/questions/750 ... c20-module