Цитата(Олег. @ May 2 2008, 07:17)

вроде с синтаксисом нет никакого криминала комерческие компиляторы отрабатывают без проблем (Borlad c++ и пр.)
"Согласен с предыдущими ораторами" - "коммерческость" отнюдь не есть синонимом строгого соблюдения стандартов, даже наоборот - каждый норовит ввести свои упрощения и свои расширения стандарта, дабы нгарод привязать.
По поводу криминала - приведу выдержку из закона в подтверждение того, что выше уже было сказано:
Цитата
3.3.4 Cast operators
...
Preceding an expression by a parenthesized type name converts the
value of the expression to the named type. This construction is
called a cast. /36/
...
36. A cast does not yield an lvalue.
Причём это из стандарта С аж 89 года, в 99 это было подтверждено.
А раз кастированное выражение не lvalue - значит ему нельзя присвоить значение и ++ не проходит.
А обойти можно так:
Код
void* ptr;
char c;
short s;
int i;
long l;
#define GET_VALUE(p,t) ( *(t*)( (*(char**)&p += sizeof(t)) - sizeof(t) ) )
void foo(void) {
c = GET_VALUE( ptr, char);
s = GET_VALUE( ptr, short);
i = GET_VALUE( ptr, int);
l = GET_VALUE( ptr, long);
}
При этом, правда, организуется доступ к объекту одного типа через приведение указателя на него к указателю на другой тип, что не всегда безопасно.
Будет предупреждение:
Цитата
warning: dereferencing type-punned pointer will break strict-aliasing rules