Можно ли поместить библиотеку в пространстве имен?

Это какое-либо использование?

public static bool CoinToss(this Random rng)
{
    return rng.Next(2) == 0;
}

public static T OneOf<T>(this Random rng, params T[] things)
{
    return things[rng.Next(things.Length)];
}

Random rand;
bool luckyDay = rand.CoinToss();
string babyName = rand.OneOf("John", "George", "Radio XBR74 ROCKS!");
6
задан Gab Royer 13 July 2009 в 17:56
поделиться

4 ответа

В основном нет. Вы можете попытаться сделать это, написав обертки и макросы, но вряд ли это сработает. Если вам действительно нужно это сделать, лучше всего разветвить библиотеку и внести необходимые дополнения в пространство имен. Конечно, вам ДЕЙСТВИТЕЛЬНО нужно это сделать, чтобы использовать этот подход, а я подозреваю, что вы этого не сделаете.

7
ответ дан 8 December 2019 в 13:48
поделиться

В принципе, вы могли бы написать программу, которая анализировала бы таблицы экспорта символов библиотеки и изменяла бы там имена символов. Конечно, вам все равно придется изменить заголовки.

При этом было бы намного проще написать простой сценарий для добавления тегов пространства имен и перекомпиляции библиотеки.

4
ответ дан 8 December 2019 в 13:48
поделиться

Общий ответ: вы не можете, но есть несколько уловок, которые вы можете сделать.

Например, objcopy из binutils ] имеет возможность копировать объект, но ставить префикс на каждый символ с помощью флага - prefix-symbols . префиксные вещи часто являются пространством имен бедняков и являются «нормальным» способом избежать конфликтов.

Использование довольно простое, примерно так:

objcopy --prefix-symbols "__mylib_" object.o new_object.o

ПРИМЕЧАНИЕ: да, это работает и с файлами .so.

ПРИМЕЧАНИЕ 2: это полностью нарушит искажение имен в C ++, поэтому пытайтесь сделать это только в библиотеке с API в стиле C. Поскольку вы говорите о добавлении пространства имен там, где его нет, я предполагаю, что это так.

4
ответ дан 8 December 2019 в 13:48
поделиться

Вы можете предоставить файл заголовка оболочки, который объявляет тот же интерфейс внутри пространства имен. В исходный файл оболочки включите заголовки библиотеки и вызовите эту библиотеку. Никакому источнику за пределами вашего источника не нужно знать о символах библиотеки. Если вы хотите быть очень осторожными, вы можете поместить все это в динамически загружаемую библиотеку.

Это было очень распространено делать это с помощью COM, чтобы скрыть зависимости компоновщика какой-либо библиотеки. Не понимаю, почему вы не можете сделать это с помощью C ++.

2
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: