Почему потоки C++ используют символ вместо неподписанного символа?

Я думаю, что ClassLoader, а точнее URLClassLoader, это путь, и я не знаю другого решения для загрузки кода во время выполнения.

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

Если файлы jar, которые вы загрузите, выполняют определенную услугу для вашего приложения, также рассмотрите удобные ServiceLoader. Он работает по тому же принципу (фактически вы можете передать его непосредственно ClassLoader), но делает его прозрачным для создания объектов из динамически загружаемой библиотеки. В противном случае вам придется немного запачкать руки, используя что-то вроде:

Object main = loader.loadClass("Main", true).newInstance();

52
задан Johannes Schaub - litb 13 December 2008 в 18:32
поделиться

3 ответа

Возможно я неправильно понял вопрос, но преобразование от неподписанного символа до символа не является неуказанным, это является зависящим от реализации (4.7-3 в стандарте C++).

тип 1-байтового символа в C++ является "символом", не "неподписанным символом". Это дает реализациям немного больше свободы сделать лучшую вещь на платформе (например, организация по стандартизации, возможно, полагала, что там существуют центральные процессоры, где арифметика байта со знаком быстрее, чем неподписанная арифметика байта, хотя это - предположение с моей стороны). Также для совместимости с C. Результатом удаления этого вида экзистенциальной неуверенности от C++ является C#;-)

, Учитывая, что "символьный" тип существует, я думаю, что имеет смысл для обычных потоков использовать его даже при том, что его со знаком не определяется. Таким образом, возможно, на Ваш вопрос отвечает ответ на, "почему C++ только не определил символ, чтобы быть неподписанным?"

25
ответ дан Steve Jessop 7 November 2019 в 19:36
поделиться

Я всегда понимал это так: цель класса iostream - читать и / или записывать поток символов, которые, если подумать, являются абстрактными сущностями, которые только представлены на компьютере с использованием кодировки символов. Стандарт C ++ прилагает большие усилия, чтобы избежать ограничения кодировки символов, говоря только, что «Объекты, объявленные как символы ( char ), должны быть достаточно большими, чтобы хранить любой член базового набора символов реализации», потому что это не так. нет необходимости заставлять «базовый набор символов реализации» определять язык C ++; стандарт может оставить решение о том, какая кодировка символов используется для реализации (компилятор вместе с реализацией STL), и просто отметьте, что объекты char представляют отдельные символы в некоторой кодировке.

Автор реализации может выбрать однооктетное кодирование, такое как ISO-8859-1 , или даже двухоктетное кодирование, такое как UCS-2 . Неважно.Пока объект char является «достаточно большим, чтобы хранить любой член базового набора символов реализации» (обратите внимание, что это явно запрещает кодирование с переменной длиной ), тогда реализация может даже выберите кодировку, которая представляет базовую латынь способом, несовместимым с какой-либо распространенной кодировкой!

Сбивает с толку, что типы char , signed char и unsigned char используют в своих именах слово «char», но важно сохранить их в помните, что char не принадлежит к тому же семейству фундаментальных типов, что и signed char и unsigned char . signed char входит в семейство целочисленных типов со знаком:

Существует четыре целочисленных типа со знаком : «signed char», «short int», «int» и «long. int. "

и unsigned char входит в семейство целочисленных типов без знака:

Для каждого из целочисленных типов со знаком существует соответствующий (но другой) целочисленный тип без знака : «unsigned char», «unsigned short int», «unsigned int» и «unsigned long int», ...

Одно сходство между char , signed char Типы и unsigned char заключаются в том, что «[они] занимают одинаковый объем памяти и имеют одинаковые требования к выравниванию». Таким образом, вы можете reinterpret_cast от char * до unsigned char * , чтобы определить числовое значение символа в наборе символов выполнения.

Чтобы ответить на ваш вопрос, причина, по которой STL использует char в качестве типа по умолчанию, заключается в том, что стандартные потоки предназначены для чтения и / или записи потоков символов, представленных char ], а не целые числа ( знаковый символ и знаковый символ ). Использование char вместо числового значения - это способ разделения проблем.

15
ответ дан 7 November 2019 в 09:36
поделиться

символ для символов, неподписанного символа для необработанных байтов данных и символов со знаком для, ну, в общем, данных со знаком.

Стандарт не определяет, если подписано, или неподписанный символ будет использоваться для реализации символа - это является определенным для компилятора. Это только определяет, что "символа" будет "достаточно" для содержания символов на Вас система - способ, которым символы были в те дни, который является, никакой UNICODE.

Используя "символ" для символов стандартный способ пойти. Используя неподписанный символ взлом, хотя он будет соответствовать реализации компилятора символа на большинстве платформ.

4
ответ дан Judge Maygarden 7 November 2019 в 19:36
поделиться
Другие вопросы по тегам:

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