Это какое-либо использование?
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!");
В основном нет. Вы можете попытаться сделать это, написав обертки и макросы, но вряд ли это сработает. Если вам действительно нужно это сделать, лучше всего разветвить библиотеку и внести необходимые дополнения в пространство имен. Конечно, вам ДЕЙСТВИТЕЛЬНО нужно это сделать, чтобы использовать этот подход, а я подозреваю, что вы этого не сделаете.
В принципе, вы могли бы написать программу, которая анализировала бы таблицы экспорта символов библиотеки и изменяла бы там имена символов. Конечно, вам все равно придется изменить заголовки.
При этом было бы намного проще написать простой сценарий для добавления тегов пространства имен и перекомпиляции библиотеки.
Общий ответ: вы не можете, но есть несколько уловок, которые вы можете сделать.
Например, objcopy из binutils ] имеет возможность копировать объект, но ставить префикс на каждый символ с помощью флага - prefix-symbols . префиксные вещи часто являются пространством имен бедняков и являются «нормальным» способом избежать конфликтов.
Использование довольно простое, примерно так:
objcopy --prefix-symbols "__mylib_" object.o new_object.o
ПРИМЕЧАНИЕ: да, это работает и с файлами .so.
ПРИМЕЧАНИЕ 2: это полностью нарушит искажение имен в C ++, поэтому пытайтесь сделать это только в библиотеке с API в стиле C. Поскольку вы говорите о добавлении пространства имен там, где его нет, я предполагаю, что это так.
Вы можете предоставить файл заголовка оболочки, который объявляет тот же интерфейс внутри пространства имен. В исходный файл оболочки включите заголовки библиотеки и вызовите эту библиотеку. Никакому источнику за пределами вашего источника не нужно знать о символах библиотеки. Если вы хотите быть очень осторожными, вы можете поместить все это в динамически загружаемую библиотеку.
Это было очень распространено делать это с помощью COM, чтобы скрыть зависимости компоновщика какой-либо библиотеки. Не понимаю, почему вы не можете сделать это с помощью C ++.