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

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

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

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

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

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

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

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

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

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

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

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

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