LINUX.ORG.RU

gcc 4 чудит?


0

0

Вот такой простой код:

int main( )
{
    char *a = "Hello";
    char *b;

    b = (a += 4);
    b = ((char*)a += 4);

    return 0;
}

gcc-3.4 компилит без проблем, а gcc-4.0 говорит

test.c: In function ‘main’:
test.c:7: error: invalid lvalue in assignment

Это поведение по стандарту или ошибка в компиляторе?
★★★★★

а это зависит от того вот такая вещь должна собираться или нет (char*)a=(char*)a+4

Reset ★★★★★
()

gcc больше не считает левосторонее приведение типов
(что-то вроде написанного (char*)a += 4) соответствующим стандарту.
Так что это не глюк компилятора, а фича :)

И, честно говоря, я с ним полностью согласен.

blackice
()

Не помню каким должен быть результат приведения 
(char*)a
в языке С, но в С++ это rvalue, и тут компилятор прав

 

aton
()
Ответ на: комментарий от php-coder

брр, это не валидная С++ программа, так что ничего конкретного сказать
не могу, но в любом случае использовать explicit type conversion крайне
не рукомендую
 

aton
()

Вообще-то об этом писали ещё в changelogs к gcc 3.4:

The cast-as-lvalue extension has been removed for C++ and deprecated
for C and Objective-C. In particular, code like this:

        int i;
        (char) i = 5;
        

or this:

        char *p;
        ((int *) p)++;
        

is no longer accepted for C++ and will not be accepted for C and
Objective-C in a future version.

В gcc 4.0 это нестандртное расширение убрали и из C/Objective-C:

The cast-as-lvalue, conditional-expression-as-lvalue and
compound-expression-as-lvalue extensions, which were deprecated
in 3.3.4 and 3.4, have been removed.

Если очень хочется играться с типом lvalue, используйте union.

bbk123 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.