Любые опции gcc для разрешения ((int *) p) ++ - PullRequest
0 голосов
/ 19 мая 2018

Некоторые компиляторы C могут иногда выводить приведенный указатель как значение lvalue, но значения по умолчанию для gcc не компилируют его.Вместо того, чтобы порт ( человек - склонен к ошибкам) ​​ устаревший код базы:

p=(int *)p+1 ; /* increment by sizeof(int) */

может gcc сделать так, чтобы этот код был указан ниже (даже если он технически не корректен)?

void f() {
    void *p ; /* type to be cast later for size */
    ((int *)p)++ ; /* gcc -c f.c => lvalue required error */ }

Редактировать: даже если он технически неверен, я предполагаю, что единственное намерение программиста для такого кода предназначено для p чтобы остаться lvalue и "увеличить" его, генерируя тот же код, что и моя длинная форма, верно?( perreal помечен как «lvalue cast»)

Edit2: Мы все согласны с тем, что рефакторинг для std C лучше, но если что-то вроде Mateo s -fpermissive сработало, он может не уловить будущие ошибки программирования, но надеяться, что начальное gcc портирование будет менее ошибочным ... Какие-нибудь другие подобные предложения?

1 Ответ

0 голосов
/ 19 мая 2018

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

Вы, конечно, по-прежнему несете ответственность за правильное выравнивание.


#include <stdio.h>

static void *increment(void * p,size_t offset)
{
char *tmp = p;
return tmp+offset;
}

int main(void)
{
void *ptr = "Hell0 world!\n";

ptr = increment( ptr, sizeof(int) );

printf("%s", (char*) ptr);

return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...