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

В 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) как1.

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

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

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

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

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

Ответы на вопрос(8)

Ваш ответ на вопрос