2011-10-28 2 views
2

Название говорит все. После включения <csetjmp>, longjmp и jmp_buf находятся в пространстве имен std, но setjmp нет. Я проверил это на MinGW4.5 и MSVC10. Изучив заголовок <csetjmp>, я не мог понять причину этого выбора. Я всегда предполагал, что каждый файл <cheader> обертывает <header.h> в пространстве имен std.Почему нет setjmp в пространстве имен std при включении <csetjmp>?

Я не прав? Каково обоснование специального случая setjmp? Пожалуйста, просветите меня!

Примечание: Я знаю о неправильном использовании setjmp/longjmp в C++.

+0

Является ли 'sigsetjmp()' доступным как предпочтительная замена? – sarnold

+0

Нет, у меня нет sigsetjmp, доступного ни внутри, ни за пределами пространства имен std после включения . – overcoder

+0

Чтобы отключить его, надеюсь. Но нет, макросы не имеют области пространства имен. –

ответ

3

setjmp может быть реализован в виде макроса, так что стандартный C++ это сказать в 17.6.1.2 [заголовки]:

имен, которые определены как макросы в C должны быть определены как макросы в стандартная библиотека C++, даже если C предоставляет лицензию на реализацию как функции. [Примечание: Имена, определенные как макросы в C включают следующее: assert, offsetof, setjmp, va_arg, va_end и va_start. -end note]

Другими словами, это макрос.

+0

Спасибо! Но разве невозможно определить псевдоним, подобный этому: '# define std :: setjmp setjmp'? – overcoder

+2

@overcoder, no. Это не правильный макрос. – MSN

+1

@overcoder: Это невозможно, потому что имя макроса может быть только одним идентификатором. –