На каком языке или инструменте вы создали свое приложение, это не имеет значения. Вам нужно убедиться, что следующие вещи выполнены, чтобы магазин Google Play не считал это новым приложением:
Вот и все.
Ваше собственное объяснение правильное. 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 *
, а отсутствие преобразования результатов является нарушением ограничения для оператора '='.
Проблема здесь не в совместимости с каким-либо диалектом C. Проблема в C ++ . В C ++ указатель void нельзя автоматически преобразовать в любой другой тип указателя. Таким образом, без явного преобразования этот код не будет компилироваться с помощью компилятора C ++.
Какой смысл приводить указатель, возвращаемый функцией malloc (), если он недействителен *?
Скорее наоборот. Вам нужно привести указатель void к фактическому типу, прежде чем вы сможете его использовать, потому что void *
ничего не означает о данных, хранящихся в этом месте.
Я не знаю, чтобы malloc когда-либо возвращал char*.
Но неявное приведение типа void* к type_t* (или любому другому типу) не всегда было разрешено. Отсюда необходимость явного приведения к нужному типу.