Теперь, когда у нас есть лямбда-выражения и анонимные методы в C#, я использую, делегирует намного больше. В C# 1, где у Вас всегда должен был быть отдельный метод реализовать логику, с помощью делегата часто, не имел смысла. В эти дни я использую делегатов к:
Не знаете. void *
будет неявно приводить к тому, что вам нужно на C. См. Также C FAQ о том, почему вы хотели бы явно избегать приведения возврата malloc в C. Ответ @ Sinan дополнительно иллюстрирует, почему это отслеживается непоследовательно.
Список часто задаваемых вопросов C является бесценным ресурсом: Почему некоторый код аккуратно приводит значения, возвращаемые malloc, к типу выделяемого указателя? .
Поскольку malloc возвращает указатель на void, то есть просто выделяет фрагменты памяти без учета данных, которые будут там храниться. В C ++ возвращаемый void * не будет неявно приведен к указателю вашего типа. В вашем примере вы не использовали то, что вернул malloc. Malloc вернул void *, который был неявно преобразован в char *, но в следующей строке вы ... хорошо, это больше не имеет особого смысла.
Это одна из немногих проблем, из-за которых утверждение «C ++ - это надмножество C» не совсем верно. В C указатель void
может быть неявно приведен к любому другому типу указателя. Однако C ++ немного строже в отношении безопасности типов, поэтому вам нужно явно привести возвращаемое значение malloc
к соответствующему типу. Обычно это не является большой проблемой, потому что код C ++ имеет тенденцию использовать new
, а не malloc
, что не требует приведения типов.
В C преобразование результата из malloc не требуется и не должно выполняться. Это может, например, скрыть ошибку #include
, поэтому у вас нет прототипа для malloc в области видимости. Это, в свою очередь, может привести к другим ошибкам и отсутствию переносимости (хотя худшие нарушители в этом отношении теперь в основном устарели).
В C ++ вы должны привести результат malloc, чтобы присвоить ему указатель на любой тип кроме недействительности. Если вам действительно не требуется для написания кода, который может быть скомпилирован как на C, так и на C ++, вам следует вообще избегать использования malloc
в C ++ и выделять память с помощью new
.
Вы обычно видите такой код C от новичков (или программистов на C ++ :-)):
int main() {
int len = 40;
char *my_string = (char *) malloc(sizeof(char)*len);
return 0;
}
Это ненужно и плохо, вы можете избежать бесполезного преобразования, включив stdlib.h
#include <stdlib.h>
int main() {
int len = 40;
char *my_string = malloc(sizeof(char)*len);
return 0;
}