Арифметика указателя, когда пустота имеет неизвестный размер [закрыто]

В Visual Studio C ++ версии 9 (и, возможно, в других версиях) следующий код:

int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;

Формируетэти ошибки:

error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size

Этот код работает под GCC, который лечитsizeof(void)&nbsp;как1.

Есть ли способ обойти это ограничение, так как приведение явно кchar *&nbsp;в целях указателя арифметика добавляет путаницы (void *&nbsp;хорошо распознается и используется как указатель на типизированную память).

Update0Обратите внимание, я хорошо знаю о существовании стандарта.I хотеть&nbsp;сделать арифметику необработанных указателей.я беруsizeof(void)&nbsp;чтобы показать, что я хорошо осознаю тот факт, что это не так1&nbsp;является причиной проблемы.Пример кода просто демонстрирует, что требуется для генерации ошибок.Я знаю, что это не "нормальный" способ использованияvoid, но это С, и такие вещи случаются.Да, люди должны делать это на низком уровне. Я не после того, почему, я после того, как. Если вы хотите знать почему, взгляните на какой-нибудь исходный код ядра или ваш дружественный glibc.Update1

Кажется, этот вопрос породил много путаницы. Вопрос не оПочему&nbsp;имеющийsizeof(void) == 1&nbsp;это не стандартно, но что делать, когда это не так.

В случае, когда должна выполняться арифметика однобайтового указателя, оказывается, что приведение кchar *&nbsp;правильный ответ, не потому что*(void *)&nbsp;не имеет размера, но потому что стандарт фактически гарантирует, что*(char *)&nbsp;является всегда1, Поэтому использованиеchar *&nbsp;всегда правильно и соответствуетvoid *&nbsp;с расширением GCC для арифметики необработанных указателей.

Чтобы еще больше подчеркнутьvoid *&nbsp;является правильным выбором для указателей на типизированную память, иchar *&nbsp;правильный тип для приведениядля арифметики необработанных указателей.