Есть тут кто-нибудь, кто предпочитает C вместо C++ хотя бы и для отдельных проектов?
Использую libxml2, это библиотека на C, и решил из интереса попробовать и свой модуль, непосредственно использующий libxml2, написать на C. Сначала оно было как бы неплохо, потом хуже. Возможно с непривычки, а есть здесь те, кто предпочитает C?
11.09.12 19:19: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, igna, Вы писали:
I>Есть тут кто-нибудь, кто предпочитает C вместо C++ хотя бы и для отдельных проектов?
I>Использую libxml2, это библиотека на C, и решил из интереса попробовать и свой модуль, непосредственно использующий libxml2, написать на C. Сначала оно было как бы неплохо, потом хуже. Возможно с непривычки, а есть здесь те, кто предпочитает C?
С более легкий для использования язык, который позволяет разработчику сосредоточиться на решении прикладных задач, а не копаться в сложностях самого языка. Его использование менее затратно по стоимости. Компиляторы С более совместимы между собой, чем компиляторы С++, то есть обеспечивается лучшая переносимость кода, если конечно речь не идет о "кросс-стандартных" компиляторах.
С значительно реже допускает компиляторам компилировать ill-formed код без соответствующей диагностики, чем С++.
> С более легкий для использования язык, который позволяет разработчику > сосредоточиться на решении прикладных задач, а не копаться в сложностях самого > языка.
Ага, сказочки всё это. Начнём например с постоянной необходимости понимать
конструкцию "ссылка (в виде указателя) на созданных в хипе объект, передаваемая
по ссылке, с возможностью изменения ссылки".
Это конечно постижимо, не rocket science, но всё же -- если на каждом шагу,
очень путает.
Здравствуйте, igna, Вы писали:
I>Есть тут кто-нибудь, кто предпочитает C вместо C++ хотя бы и для отдельных проектов?
I>Использую libxml2, это библиотека на C, и решил из интереса попробовать и свой модуль, непосредственно использующий libxml2, написать на C. Сначала оно было как бы неплохо, потом хуже. Возможно с непривычки, а есть здесь те, кто предпочитает C?
на Си пишут либо те у кого нет компилятора С++, либо те кто ниасилил С++
I>Есть тут кто-нибудь, кто предпочитает C вместо C++ хотя бы и для отдельных проектов?
Да.
I>Использую libxml2, это библиотека на C, и решил из интереса попробовать и свой модуль, непосредственно использующий libxml2, написать на C. Сначала оно было как бы неплохо, потом хуже. Возможно с непривычки, а есть здесь те, кто предпочитает C?
Да.
Встречный вопрос, это для разжигания флейма, или действительно интересно? Ведь задавать тут такой вопрос, это как в бочку с бензином спичку кинуть.
Кроме того многие компиляторы С++ имеют собственные расширения языка, которые меняют семантику стандартных конструкций. Если вы используете, например, MS VC++ или Embarcadero C++ Builder, то вы будете спотыкаться на каждом шаге, не зная, то ли вы имеете дело с расширением языка компилятора, то ли это обыкновенный баг компилятора, то ли вы сами что-то делаете не так. Кроме того недостаточно высокая квалификация программиста ( я не имею в виду низкую квалификацию, а именно недостаточно высокую, что характерно для подавляющего числа программистов С++) может привести к тому, что в коде будет использоваться семантически неверная конструкция с неопредленным поведением, которая при переносе кода на другую платформу может привести к серьезным последсвтиям в смысле затрат по устранению этого изъяна.
Кроме того программы С++ сильно зависят от начальных правильных проектных решений, заложенных в них. Если начальные проектные решения были неправильны, то изменить их на более поздней стадии разработки программы бывает очень сложно, а порой даже просто невозможно. У меня сейчас нет ссылки под рукой, но насколько я помню, число незавершенных проектов на С++ существеннно выше числа незавершенных проектов на С.
Разработка проекта на С++ требует значительно больше усилий от программистов, чем на С. Обычно в группе имеются программсты с разной квалийикацией, с разным знанием специфических особеннностей того или иного компилятора, а это приводит к тому, что программистам приходится тратить много времени на выявление некорректных конструкций при ревью кода. То есть много времени тратится на выяснение, правильный ли это код или нет. И то, что код на С++ успешно компилируется, совершенно не означает, что он корректный, а поведение программы опредленное.
Все это делает проекты на С++ более затратными.
Здравствуйте, MasterZiv, Вы писали:
MZ>Я бы только один проект писал на С -- ядро линукса. Остальные -- только на MZ>плюсах. С так ужо убого выглядит, что просто морально нельзя его терпеть.
Вы это так говорите, будто С++ выглядит менее убого.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Встречный вопрос, это для разжигания флейма, или действительно интересно?
Это действительно интересно, потому-что хочу задать более конкрентые вопросы. Например, если функция должна разместить массив строк и вернуть его, как ты это делаешь? Например:
int get_lines_as_strings(FILE *, char const *const **); // возвращает количество строк
или
struct strings {
int num; // количество строкchar const *const *str;
};
void get_lines_as_strings(FILE *, struct strings *);
или
struct strings {
int num; // количество строкchar const *const *str;
};
struct string get_lines_as_strings(FILE *);
Здравствуйте, igna, Вы писали:
I>Это действительно интересно, потому-что хочу задать более конкрентые вопросы. Например, если функция должна разместить массив строк и вернуть его, как ты это делаешь? Например: I>или еще как?
Строго говоря, ни один из ваших вариантов не возвращает массив строк.
Я бы сделал как-то так:
int get_lines_as_strings(FILE *, char **ptr); // возвращает количество строк и устанавливает указатель на массив указателей на строки.
Здравствуйте, igna, Вы писали:
I>Ты третью звездочку точно не забыл?
Чтобы был указатель на указатель на указатель на массив строк? we need to go deeper Можно, а зачем?
int get_lines_as_strings(FILE *, char **ptr);
...
char *strings; // указатель на первый (нулевой) элемент массива строк.int numlines = get_lines_as_strings(f, &strings);
On 09/11/2012 04:42 PM, SilentNoise wrote:
> MZ>Я бы только один проект писал на С -- ядро линукса. Остальные -- только на > MZ>плюсах. С так ужо убого выглядит, что просто морально нельзя его терпеть. > Вы это так говорите, будто С++ выглядит менее убого.
Здравствуйте, igna, Вы писали:
I>И каким будет значение strings после вызова get_lines_as_strings?
Виноват, совсем запутался Да, надо 3 звездочки.
Но идею, думаю, Вы поняли.
AS>>Встречный вопрос, это для разжигания флейма, или действительно интересно? I>Это действительно интересно, потому-что хочу задать более конкрентые вопросы. Например, если функция должна разместить массив строк и вернуть его, как ты это делаешь? Например: I>или еще как?
Дык, а как это обычно делается в С++? Используется соответствующий фреймворк/библиотека примитивов. Ну и я то же использую свой фреймворк. Возвращаю массив строк.
Условно говоря —
YO_ARRAY *Oj_Get_Lines(void *file) {
YO_ARRAY *arr = Array_Pchars();
char *S;
while (( S = Oj_Read_Line(file) )) Array_Push(__Retain(S));
return arr;
}
YO_ARRAY *arr = Oj_Get_Lines(Cfile_Open("file","r"));
или
char lines[] = "line1\nline2\nline3";
YO_ARRAY *arr = Oj_Get_Lines(Memory_As_File(lines,strlen(lines)));
или с любого объекта который реализует протокол чтения строки.
Здравствуйте, MasterZiv, Вы писали:
MZ>А теперь прочитай всё это, заменив С++ на С и наоборот. MZ>Будет тоже всё верно!
Не будет, ибо те средства абстракции, которые есть в С++ но отсутствуют в С, сделаны так монструозно, что приносят больше проблем чем профита.