C ++: Как заставить объявления libc в std ::? - PullRequest
5 голосов
/ 05 февраля 2011

Итак, мне нужно libc в моей программе на C ++.Однако мне не нравится идея разбрасывать ее по всему глобальному пространству имен.В идеале я хотел бы принудительно ввести всю библиотеку libc в пространство имен std::, поэтому мне придется делать std::memcpy, а не memcpy.

Возможно ли это?И как?Я готов использовать макросы, специфичные для компилятора, если это необходимо (я нацеливаюсь только на MS VC ++ 10.0 и GCC 4.6).

Редактировать: я буквально подразумеваю «форсировать объявления в std», чтобы они не вызывалисьпрефикс std ::.Кроме того, я включаю cstdio, а не stdio.h.

Спасибо!

Ответы [ 4 ]

1 голос
/ 05 февраля 2011

Я буквально имею в виду «принудительно объявлять объявления в std», чтобы они не вызывались без префикса std ::.

Вы не можете сделать это, если ваша реализация выставляет имена в глобальном пространстве имен. Вы можете использовать заголовки, а затем использовать std ::self.

Это, возможно, неудачно, но это является следствием совместимости с C, поскольку C не понимает пространства имен. C ++ традиционно поддерживает множество клуджей и жертв для совместимости с C.

1 голос
/ 06 февраля 2011

Вы не можете сделать это, если это еще не сделано.

Пространство имен std зарезервировано для стандартной библиотеки, запрещено добавлять новых членов в это пространство имен.Поэтому, если C-заголовки еще не встроены в std, у вас нет другого выбора, кроме как принять его.

С другой стороны, вы можете идеально создать новое пространство имен cstd ипринесите в него символы из глобального пространства имен с директивами using ... но это не заставит их исчезнуть из глобального пространства имен.

0 голосов
/ 06 февраля 2011

Причина, по которой некоторые (большинство?) Компиляторы C ++ имеют функции C в глобальном пространстве имен, заключается просто в том, что им приходится использовать существующие функции операционной системы. Например, файловые функции могут быть не отдельной библиотекой C, а обработкой файлов в ОС.

0 голосов
/ 05 февраля 2011

Сделать обертку включает

//stdlib.hpp
namespace std
{
#include <stdlib.h> //edit: changed from cstdlib to stdlib.h
}

Если компоновщик ненавидит это, попробуйте объявить нужные вам функции:

namespace std{ extern "C" {

int memcpy( void *out, const void *in);
} }
...