Я понимаю, что C и C ++ - это разные языки, но когда я изучал C ++, мне всегда говорили, что C - это подмножество C ++ или C ++ - это C с классами. И это было совершенно верно до появления C ++ x0, C ++ 11 (или современного C ++ 11/14/17 в целом). На самом деле (особенно при работе со встроенными системами) очень вероятно найти код, написанный на C ++, но с большим количеством частей, написанных полностью на чистом языке C. Здесь у меня есть несколько вопросов:
- Должен ли я прекратить использование термина C / C ++?
- Если ответ на вопрос № 1 - да, как бы я назвал программу, которая использует смесь C и C ++?
- Учитывая, что оба они «разные» языки, вполне вероятно, что в какой-то момент компиляторы C ++ перестанут поддерживать код, написанный на языке C (поскольку современный c ++ расходится с менталитетом C для базовых вещей, таких как указатели, обработка динамической памяти и т. Д.)
- Есть ли сейчас какое-либо сотрудничество между людьми, которые делают стандарты C / C ++, чтобы сохранить совместимость
- Если № 4 - да, такое сотрудничество может закончиться в ближайшем будущем с появлением современного c ++ (14.11.17)
Я знаю, что там уже есть подобные вопросы, но я уверен, что многие люди разделяют эти вопросы, поэтому мне очень интересно получить хорошие ответы, особенно по вопросам, связанным с тенденцией C ++ в ближайшем будущем.
c++
c
terminology
c++11
rkachach
источник
источник
Should I stop using the term C/C++
, Да. Это используется только рекрутерами и HR. Инженеры будут использовать терминC
илиC++
как независимые языки. Если вы найдете инженера, который смешивает термин, избегайте их.Ответы:
C никогда не был подмножеством C ++. Самый очевидный пример этого
int new;
. Это было верно с C89 и C ++ 98, и языки только выросли друг от друга по мере появления новых стандартов.да
Исходный файл написан на одном языке или другом. Программа может состоять из кода из нескольких языков, работающих вместе, или из исполняемого файла, созданного путем связывания различных скомпилированных объектов. Вы сказали бы, что программа написана на C и C ++, «C / C ++» не является языком.
3) Они никогда не делали.
char *a = malloc(10);
, C и C ++ никогда не были полностью совместимы, по крайней мере, до тех пор, пока у них были стандарты ISO (я не знаю всех подробностей о предварительно стандартизированных днях). нажмите на ссылку или посмотрите ниже файл, который подходит для C89 и выше, но не подходит ни для одного стандарта C ++.4) На самом деле, рабочие группы знают друг о друге, но стандарты принимают решения, которые лучше для них самих.
Я всегда чувствую, что стоит упомянуть, что C является подмножеством Objective-C.
источник
javac
тоже может работать , но какой в этом смысл?C/Fortran/sh
имеет смысл сейчас ?! ioccc.org/years-spoiler.html#1986 .Там есть быть причиной , почему эти термины объединяются так часто. Хотя вы не должны говорить своему преподавателю C, что его язык является подмножеством C ++, здесь есть доля правды. Другие уже раскрыли точку зрения вашего учителя. Это очень приятно (и проиллюстрировано примерами и т. Д.). Но мы не живем в башне из слоновой кости или в книге.
Вашему большому боссу наплевать на то, какой язык вы используете. Если он немного разбирается в программировании, просто скажите ему, что вы использовали C / C ++, и это будет звучать так: «Я использовал язык, который должен быть скомпилирован в машинный код, с DLL и всеми сложными вещами». Это часть «внешнего общения».
Если вы создаете библиотеку, которая может взаимодействовать с C и C ++, вы определенно захотите назвать ее библиотекой C / C ++. Конечно, кто-то поднимет руку и спросит, почему вы не называете это библиотекой C, в которой есть оболочка C ++, и в любом случае C ++ может ссылаться на библиотеки C, так что вам вообще не нужно об этом упоминать. Просто ответьте: «Да, вы правы, это библиотека C / C ++». Это часть «внутреннего общения».
Если вы создадите лексический анализатор для C ++, вы будете удивлены, насколько хорошо он работает с C. Возможно, вам даже не придется изменять все это. Это «если это похоже на утку и т. Д.» часть.
И т.п.
Большинство программ на C, которые я когда-либо видел, компилируются (и работают) без изменений в виде кода C ++. Не позволяйте нескольким исключениям или догматическим (хотя и влиятельным) программистам обмануть вашу интуицию. C и C ++ настолько близки, и так часто совместимы, и так часто смешаны и сопоставлены, что используется термин C / C ++. Он используется потому, что он полезен для описания подобных ситуаций, когда не имеет значения, рассматриваете ли вы C или C ++, если это не Java или PHP . Мы знаем, что это «неправильно», но нам все равно, это более полезно, чем неправильно.
Это может быть оскорбление, это может быть глупо, но, тем не менее, я не уверен, какую выгоду вы получите, будучи более педантичным, чем нужно, и отказываясь общаться в терминах, понятных другим. Если вы чувствуете себя неловко в какой-то конкретной ситуации, просто не используйте общий термин C / C ++, а тот, который имеет отношение к делу (C или C ++).
Не бойся будущего. Наши операционные системы написаны на языке C. Довольно много современных программных продуктов на C / C ++ происходит на C ++. Эта пара здесь, чтобы остаться на некоторое время. Никто не заинтересован в том, чтобы одно стало более несовместимым с другим (на самом деле, наоборот).
Чтобы быть конкретным о ваших точках:
1) Это зависит Да, когда это может привести к путанице, когда вы чувствуете себя неловко, или когда это просто неправильно или выходит из контекста. Нет, когда вы думаете, что это адекватно.
2) Н / Д
3) Думаю нет, но у меня нет хрустального шара.
4) понятия не имею
5) Я так не думаю, потому что в этом направлении ничто не подталкивает
источник
C/C++
не является ясным, и, следовательно, не является полезным. Следуя вашим примерам, aC/C++ library
может означать либо библиотеку C с оболочкой C ++, либо библиотеку C ++ с оболочкой C. Или это может означать, что библиотека состоит из нескольких модулей, некоторые скомпилированы с использованием C ++, некоторые скомпилированы в C. Это не совсем понятно. Для меня сказать, что библиотека сделана в,C and C++
намного более ясно, илиC library with compatibility with C++
также намного более ясно. И здесь двусмысленность только с двумя языками, представьте себе, что вы используете эту «коммуникационную стратегию» для большего ...Идя против течения, я бы сказал, что это зависит от контекста .
Термин «C / C ++» обычно не подходит, когда говорится что-то вроде «это программа C / C ++», но это было подробно рассмотрено в других ответах.
Однако могут быть ситуации, когда C / C ++ может быть подходящим.
источник
or
, а не как логическийxor
. Так что это либо один, либо оба. В списках вакансий вы знаете либо C или C ++, либо оба. Теперь я чувствую, что многие люди религиозны в отношении этого термина. Хороший C программист будет прекрасно собирание C ++ независимо друг от друга , как отличаются оба языка. Я начал программировать на PHP, а затем перешел на Scala (два совершенно разных языка). Почему программист C не смог бы использовать C ++ или наоборот? Термин C / C ++ имеет некоторые преимущества, если он используется в правильном контексте.Есть много тонких различий между C и C ++. Например, в C ++
const
переменная в глобальной области имеет внутреннюю связь, если она не объявленаextern
, но в C она имеет внешнюю связь, если она не объявленаstatic
. Говоря «C / C ++», OP утверждает, что ответ на их вопрос одинаков как в C, так и в C ++, хотя это может быть совсем не так. Это излишне усложняет жизнь потенциальным ответчикам.Иногда мы можем заметить, что код недопустим на одном или другом языке (например, неявные преобразования из
void*
указателя на объект недопустимы в C ++). Это раздражает. Почему вы говорите «C / C ++», когда у вас есть фрагмент кода, который действителен на C, но не на C ++? Вы имели в виду C, или это просто ошибка в коде, предназначенном для C ++?Иногда ответ будет отличаться в зависимости от языка (например, массивы переменной длины существуют в C99, но не в C ++). Если мы не знаем, на каком языке вы говорите, либо нам нужно угадать, либо написать ответ для обоих, когда на самом деле будет полезен только один, потому что вы знаете, какой язык вы на самом деле используете; Вы просто не говорите нам!
Иногда ответ действительно одинаков для обоих языков, но в этом трудно быть уверенным. Например, я думаю, что C и C ++ имеют одни и те же правила преобразования целых чисел, но для того, чтобы быть действительно, действительно уверен, я должен внимательно прочитать оба стандарта. Опять же, это заставляет меня выполнять вдвое больше работы, чем необходимо, когда вы, вероятно, заботитесь только об одном из языков.
В любом случае, чтобы ответить на другие ваши вопросы:
Да.
Если вы связываете код C и C ++, допустимо использовать оба тега, но, пожалуйста, укажите, на каком языке находится каждый файл.
Иногда происходят критические изменения, но они редки и, как правило, ограничены в воздействии (в противном случае они не получают одобрения). Например,
auto
в C ++ 11.Я не думаю, что они напрямую сотрудничают, но они обращают внимание на события на другом языке и стараются избегать внесения изменений, которые затрудняют совместимость.
И если вы действительно хотите знать об обоих языках, это нормально, и вы можете сказать это в своем вопросе. Когда вы говорите «C / C ++», я не совсем понимаю, что вы имеете в виду, и похоже, что вы делаете предположение о двух языках.
источник
struct class
чего-то подобногоstruct klass
именно по этой причине, и затем неизменно сбивается Линусом.C никогда не был подмножеством C ++. Например, C89 не является подмножеством C ++ 98.
Несколько примеров:
int
противbool
)Да.
Программа - это C или C ++ (если даже некоторая базовая программа может быть скомпилирована с помощью компилятора C или C ++). Какой компилятор вы используете для его компиляции? Это должно ответить на ваш вопрос. Harbison & Steele придумал термин Clean C для обозначения общего подмножества C и C ++, но я думаю, что это была плохая идея.
РЕДАКТИРОВАТЬ : Тем не менее, я допускаю, что технически вы можете связать файлы объектов C и C ++ в одной программе, но OTH есть много языков, которые разрешено смешивать в одной программе, например, Java и C ++. Я думаю, что использование термина C / C ++ программа только добавляет путаницы, что она написана на одном языке, называемом C / C ++.
Существует множество функций (например: массив переменной длины, гибкий член массива
_Generic
, ...) C99 или C11, которые не поддерживаются ни одной версией C ++.источник
Некоторые программы написаны на смеси C и C ++
Это просто факт жизни. Вы можете скомпилировать объектные файлы из C и C ++ и связать их вместе. Результат вполне можно назвать «программой на C / C ++».
Но это только программа в целом. Как насчет отдельных единиц компиляции?
Существует подмножество C, которое также является подмножеством C ++
Программа (или модуль компиляции), написанная в этом подмножестве, будет компилироваться и вести себя одинаково при совместимых компиляторах C и C ++. Такую программу или файл по праву можно назвать «программой на C / C ++» или «файлом на C / C ++».
Частичная программа, такая как заголовочный файл, также может использоваться в программах на C и C ++. Такие заголовочные файлы могут по праву называться заголовками C / C ++.
Цитирую профессора Бьярне Страуструпа:
Так что да, есть такая вещь, как C / C ++. Это все, что является действительным C и C ++.
Препроцессор C является частью языка C. Препроцессор C ++ является частью языка C ++
Вы можете написать модуль компиляции, который будет компилироваться в C или C ++ и быть другим . Например, он может иметь базовые функциональные возможности, скомпилированные в C, но использовать преимущества библиотеки C ++, если скомпилирован в C ++.
Если программа по сути такая же, но с дополнительными функциями, то не совсем неправильно говорить, что это та же самая программа. Это то же самое, но и другое.
Большинство программистов на Си могут сделать хотя бы немного C ++ и наоборот
Нередко называть такого человека программистом на C / C ++. Да, они, вероятно, специализируются на одном, но есть ли кто-нибудь, кто является компетентным программистом C или C ++, который буквально не может сделать ни один из других языков? В каком-то смысле, не все ли они программисты на C / C ++?
Нет ничего плохого в том, чтобы сказать "C / C ++". Что важно понимать
Английский язык не является инструментом для выражения силлогизмов . Вы можете использовать английский для логики, но только справедливо и с большими усилиями.
Это потому, что слова, естественно, не имеют точного значения, а скорее смутное облако значений и коннотаций. Важно то, что люди понимают, что вы говорите.
источник
Абсолютно. Не ясно, что эта конструкция предназначена для выражения, за исключением, возможно, путаницы в том, что C и C ++ от имени человека, который использует этот термин.
Так как эта путаница является таким распространенным источником разочарования, многие люди стали весьма эмоциональны по этому поводу, и появление одного только этого термина будет достаточной причиной, чтобы они стали негативно относиться к вашему вкладу. Это может показаться глупым, но, похоже, это то, что мы имеем.
Я рекомендую вместо того, чтобы говорить о «C / C ++», использовать термин, который на самом деле проясняет, что вы имеете в виду.
Если вы говорите о чем - то в C , что может или не может быть также верно для C ++, просто сказать C .
Если вы говорите о чем-то в C ++, что может или не может быть правдой для C, просто скажите C ++ .
Если вы хотите указать на сходство между C и C ++, скажем, C и C ++ .
Я на самом деле рекомендую вам быть более конкретным и говорить не только о «C» или «C ++», но и о точной версии. Оба языка развиваются и тупое утверждение, такое как
не правильно и не неправильно.
Поскольку языки перекрываются, каждая программа на С будет содержать части, которые могут выглядеть как С ++, и наоборот. Тем не менее, авторы, вероятно, остановятся на использовании компилятора C или C ++. Так что скажите «программа написана на C », если она компилируется с помощью компилятора C, и «программа написана на C ++ », если они используют компилятор C ++, даже если они могут отказаться от использования каких-либо современных функций C ++. Некоторые люди называют такой код C ++ C-style C ++ . Отсутствие перегрузки, исключений, полиморфизма, шаблонов и потоков ввода-вывода - это общие характеристики такого кода.
Если вместо этого некоторые файлы написаны на C и скомпилированы с помощью компилятора C, а некоторые другие файлы написаны на C ++ и скомпилированы с помощью компилятора C ++, а затем объектные файлы, связанные вместе, я бы сказал, что «программа написана на смесь C и C ++ », как вы, собственно, и сделали.
Однако, если, вместо этого, авторы очень тщательно написали каждый файл таким образом, чтобы его можно было скомпилировать с помощью компилятора C или C ++, и полученная в результате программа сделала бы то же самое, вы могли бы сказать, что «программа написано в общем подмножестве C и C ++ ».
Последнее часто имеет место для заголовочных файлов, которые должны быть разделены между C и C ++ кодом. Кстати, писать такой код нелегко. Если вы хотите еще больше подчеркнуть , что только такие конструкции были использованы , которые действуют в C и C ++ и широко поддерживаются различными поставщиками компиляторов, термин портативного общее подмножество C и C ++ может быть использовано , чтобы подчеркнуть это.
Я не уверен, что понимаю этот вопрос. Поскольку C и C ++ - это разные языки, вы не можете ожидать, что компилятор для одного из них примет программу, написанную для другого. Тем не менее, компиляторы часто проектируются модульно, и если у компилятора есть интерфейс на языке C ++ , есть хорошие шансы, что он также будет иметь интерфейс на языке Си. (Затем вы должны выбрать, какой из них вы хотите, с помощью переключателя командной строки или аналогичных средств.) Пока оба языка будут широко использоваться, кажется маловероятным, что это изменится. Ваше мнение о «современном C ++», я думаю, в основном связано с хорошими стандартами кодирования и стандартной библиотекой. С точки зрения компилятора , эволюция обоих языков скорее сходится, чем расходится.
Да. Модель памяти и библиотека атомарных операций, представленные в C ++ 11 и C11, являются хорошим примером. Кажется, что разработчики обоих языков осознают важность совместимости и работают над ее улучшением. Лично я хотел бы, чтобы сотрудничество было более интенсивным, и две рабочие группы ИСО, возможно, даже объединились, но мои пожелания не важны.
Бьярн Страуструп говорит о различиях и общности между различными версиями C и C ++ в § 44.3 4-го издания языка программирования C ++, который, по иронии судьбы, называется «Совместимость с C / C ++». Использование термина может быть действительно уместным в этом случае, поскольку ясно, что имеется в виду.
Как уже говорилось выше, это произошло в C ++ 11 и, как ожидается, должно произойти снова.
источник
C / C ++ является пересечением C и C ++.
int new;
не является C / C ++ и не являетсяvector<int> foo;
.Точно так же C89 / C99 является пересечением этих двух языков, где ни один
enum bool { false, true };
илиfor(int i = 0;;)
не допускается.И C ++ 11 / C ++ 14 и т. Д.
Можно написать код, который компилируется (и корректно выполняется) в C ++ 11 и C ++ 14, даже если компиляция в одном не подразумевает компиляцию в другом. На самом деле, многие люди делают это.
И многие люди пишут код, который работает на C и C ++.
Очевидно, что чем больше перекрытие, тем больше смысла в этом; Я не ожидаю увидеть какие-либо вопросы о коде C / C ++ / Java.
Хотя имеет смысл говорить об общем подмножестве этих языков, многие вопросы не будут иметь ответов в этом подмножестве, например, что должен вернуть main () в C и C ++?
Но вы можете говорить о коде, который работает для нескольких языковых спецификаций, независимо от того, различаются ли эти спецификации по «версии» или «названию языка» или иным образом.
источник
Это своего рода ответ на позицию, что «это код для программистов, которые работают близко к железу и в контексте управления работают нормально», что можно увидеть в некоторых других ответах и комментариях.
Я бы сказал, что даже к этой интерпретации следует относиться с осторожностью.
Начиная, по крайней мере, с середины 90-х годов, если бы вы хотели программиста на C ++ и того, кто описывал себя как программиста на C, вам пришлось бы спросить, сколько они знают об объектно-ориентированном проектировании, сколько у них опыта в отладке в объекте. ориентированный контекст и об их способности использовать библиотеки шаблонов. Вы бы хотели исследовать именно эти вопросы во время собеседования и процесса найма.
С другой стороны, прошло уже более десяти лет с тех пор, как гуру C ++ начали продвигать «современный C ++», что означает акцент на переходе от простых указателей к более безопасным объектам-указателям и идиомам на основе итераторов. С появлением C ++ 11 в настоящее время явно поддерживается многопарадигмальное программирование, и стремление к коду, который не имеет голых указателей, очень сильно. Это означает, что, если бы сегодня я брал интервью у программиста C ++ для позиции на C, я был бы очень обеспокоен проверкой того, насколько знаком этот человек с реальными указателями с включенной атлетикой.
Я не занимаюсь бизнесом в эти дни (даже в той степени, в которой был, когда Stack Overflow находился в зачаточном состоянии), поэтому я не рискну догадываться, как часто воображаемый собеседник не будет иметь навыков перекрестного перехода, но Я думаю, что, как это чаще всего применяется, языки сейчас действительно сильно отличаются.
Короче говоря, C / C ++ следует отбрасывать не только в техническом контексте, но и в большинстве бизнес-контекстов.
источник
Самый простой ответ на этот вопрос заключается в том, что вы никогда не должны были использовать этот термин. Это термин, который не должен существовать. Это не имеет смысла. Каждая программа - это C или C ++.
C ++ 98 и 03 даже не являются C-классами. Тот, кто научил тебя этому, не знает дерьма, и ты можешь забыть их. Это никогда не было правильно.
источник
Концептуально не должно быть особых трудностей при проектировании исходных файлов на C, чтобы они также могли быть скомпилированы как есть с C ++. В этом действительно могут быть некоторые существенные преимущества. Например, при написании кода для встроенной системы иногда полезно иметь возможность протестировать код в среде размещенного ПК. Если код компилируется чисто как C ++, возможно иметь выражение вроде "MOTOR_ENABLE = 1;" записывать в энергозависимый бит ввода / вывода во встроенной системе (скомпилированный как C), но запускать логику эмуляции на ПК (компилируя как C ++). Вероятно, было бы также возможно спроектировать тип C ++ на ПК, который бы вел себя так, как ведет себя uint16_t в небольших встроенных системах (так что, например, учитывая данные
u16 x=65533;
, компилятор должен учитывать значениеx*x
девятке, а не свободному правлению, чтобы делать все, что захочет), хотя пока еще ни один из моих эмуляторов не включил это [отчасти потому, что компиляторы C ++, которые я использовал, не сделали ничего дурацкого в таких случаях].К сожалению, программисты на C и C ++ имеют достаточную антипатию друг к другу, что языки с годами развивались совместимым образом. В то время как C89 пытался адаптировать некоторые из более полезных функций C ++ (таких как прототипы функций), похоже, возникло мнение, что программисты, которым нужна любая из функций C ++, должны использовать C ++, игнорируя тот факт, что во многих ситуациях это быть полезным, чтобы иметь возможность использовать некоторые функции C ++ (например, возможность перегружать функции статической или статической встроенной связью, не принимая на себя затраты, связанные с другими функциями, которые не нужны (например, искажение имени, связанное с экспортом). перегруженные функции).
Хотя пересечение C89 и C ++ 98 является работоспособным языком, полезный надмножество более поздних версий C с более поздними версиями C ++, вероятно, сократился, а не вырос (благодаря таким вещам, как правило строгого псевдонима), и тенденции благоприятствуют растущая трещина.
источник
namespace
и объявить второе какextern "C"
, а затем использовать компилятор C ++.extern "C"
же есть и другие сложности (например, инициализация статического объекта и т. Д.)? Есть ли способ в C ++ сделать так, чтобыfoo(1234)
он вызывалfoo_const(1234)
макрос, в то время какfoo(x)
[гдеx
нет константы] будет вызыватьfoo_var(x)
функцию? Во встроенном коде есть много ситуаций, когда для «функции» может иметь смыслSET_PORT(port, state)
иметь три формы в зависимости от того, являются ли порт и состояние обоими ...