Casting void pointers

На каком языке или инструменте вы создали свое приложение, это не имеет значения. Вам нужно убедиться, что следующие вещи выполнены, чтобы магазин Google Play не считал это новым приложением:

  • имя пакета должно совпадать с именем пакета приложения, которое вы заменяете. Тот же корпус тоже.
  • вы должны использовать то же хранилище ключей , что и заменяемое вами приложение было подписано
  • , как и при любом другом обновлении приложения, код версии в манифесте должен быть увеличен - выше чем предыдущая версия приложения

Вот и все.

17
задан Blagovest Buyukliev 27 April 2011 в 19:29
поделиться

4 ответа

Ваше собственное объяснение правильное. Pre-ANSI C ('K&R' C) не имел типа void * с неявным преобразованием. char * удваивается как псевдо void * тип, но вам нужно явное преобразование приведения типа.

В современном C приведение типов не одобряется, поскольку оно может подавлять предупреждения компилятора об отсутствующем прототипе malloc . В C ++ требуется приведение типов (но в большинстве случаев вы должны использовать new вместо malloc ).

Обновление

Мои комментарии ниже, которые пытаются объяснить, почему требуется приведение, были немного неясными, я постараюсь объяснить это лучше здесь. Вы можете подумать, что даже когда malloc возвращает char * , приведение не требуется, потому что оно похоже на:

int  *a;
char *b = a;

Но в этом примере также требуется приведение. Вторая строка - это нарушение ограничения для простого оператора присваивания (C99 6.5.1.6.1). Оба операнда-указателя должны быть совместимого типа.Когда вы меняете это значение на:

int  *a;
char *b = (char *) a;

, нарушение ограничения исчезает (оба операнда теперь имеют тип char * ), и результат четко определен (для преобразования в указатель char). В «обратной ситуации»:

char *c;
int  *d = (int *) c;

тот же аргумент справедлив для приведения, но когда int * предъявляет более строгие требования к выравниванию, чем char * , результат определяется реализацией .

Заключение: до появления ANSI преобразование типа было необходимо, потому что malloc вернул char * , а отсутствие преобразования результатов является нарушением ограничения для оператора '='.

23
ответ дан 30 November 2019 в 12:43
поделиться

Проблема здесь не в совместимости с каким-либо диалектом C. Проблема в C ++ . В C ++ указатель void нельзя автоматически преобразовать в любой другой тип указателя. Таким образом, без явного преобразования этот код не будет компилироваться с помощью компилятора C ++.

6
ответ дан 30 November 2019 в 12:43
поделиться

Какой смысл приводить указатель, возвращаемый функцией malloc (), если он недействителен *?

Скорее наоборот. Вам нужно привести указатель void к фактическому типу, прежде чем вы сможете его использовать, потому что void * ничего не означает о данных, хранящихся в этом месте.

-3
ответ дан 30 November 2019 в 12:43
поделиться

Я не знаю, чтобы malloc когда-либо возвращал char*.

Но неявное приведение типа void* к type_t* (или любому другому типу) не всегда было разрешено. Отсюда необходимость явного приведения к нужному типу.

3
ответ дан 30 November 2019 в 12:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: