Задать вопрос
@likilix
Лицемер

Объясните, пожалуйста, смысл такого фрагмента кода класса _Iosb файла xiosbase?

#define _IOSskipws	        0x0001
#define _IOSunitbuf	0x0002
#define _IOSuppercase	0x0004
#define _IOSleft		0x0040
#define _IOSright		0x0080
#define _IOSinternal	0x0100

template<class _Dummy>
	class _Iosb
	{	// define templatized bitmask/enumerated types, instantiate on demand
public:
	enum _Dummy_enum {_Dummy_enum_val = 1};	// don't ask
	enum _Fmtflags
		{	// constants for formatting options
		_Fmtmask = 0xffff, _Fmtzero = 0};

	static constexpr _Fmtflags skipws = (_Fmtflags)_IOSskipws;
	static constexpr _Fmtflags unitbuf = (_Fmtflags)_IOSunitbuf;
	static constexpr _Fmtflags adjustfield = (_Fmtflags)(_IOSleft
		| _IOSright | _IOSinternal);


Почему нельзя было объявить _IOSskipws и другие поля внутри перечисления _Fmtflags ?
Правильно ли понимаю, что после присвоения _Fmtflags skipws = (_Fmtflags)_IOSskipws; _IOSskipws становится челном перечисления _Fmtflags ?
Оказывают ли поля _Fmtmask = 0xffff, _Fmtzero = 0 перечисления _Fmtflags, какое либо влияние на поля _IOSskipws и другие поля, например, поле skipws поменяет значение своих битов после присвоения ?
  • Вопрос задан
  • 50 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Правильно ли понимаю, что после присвоения _Fmtflags skipws = (_Fmtflags)_IOSskipws; _IOSskipws становится челном перечисления _Fmtflags ?


Нет, сначала препроцессор заменит _IOSskipws на 0x0001, потом skipws инициализируется 0x0001.

Зачем так сделано? Может, кто-то очень жестко следует правилу не использовать магические числа в коде. Все константы должны быть как-то определены заранее. Видимо, в стиле, принятом тут, константы заводят через define.

Или IOSskipws используется в инициализации каких-то еще констант в этом или другом классе и тогда имеет смысл заводить его отдельно.

Оказывают ли поля _Fmtmask = 0xffff, _Fmtzero = 0 перечисления _Fmtflags, какое либо влияние на поля _IOSskipws


_IOSskipws - это вообще не поле, это символ, заменяемый препроцессором на 0x0001. Он с точки зрения С++ вообще не существует.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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