leofun01 написав:В enterprise дуже часто ці 3 йдуть в одному комплекті.
Ну, з embedded все ж, напевно, частіше таки йде С, але і плюси теж там є, так.
bebyk написав:роботодавці шукають в одній пачці С, С++ (дві різні мови, на секундочку) та Ембедед
І справді, ентерпрайс зазвичай для С та С++ кардинально відрізняється. Тоді чому для embedded часто вказують С/C++? Спробую трохи пояснити. Якщо ми розглядаємо embedded, то рішення під нього на С та С++ (часто) будуть не так кардинально відрізнятися, як в інших випадках.
Візьмімо за приклад bare-metal embedded. Bare-metal embedded програмування — це написання програмного забезпечення, яке працює безпосередньо на апаратному забезпеченні без будь-якої абстракції, як-от операційних систем. Отже, що в такому випадку нам пропонує С++? Насправді не дуже багато чого, фактично все, що ми можемо використовувати – це freestanding implementation. Яке дає нам гарантії типу:
cppreference написав:In a freestanding implementation execution may happen without an operating system.
Отже, ми можемо писати С++ код навіть без наявності ОС, круто? Насправді не дуже, гляньмо, підтримку яких заголовків ми маємо в freestanding implementation:
▼Прихований текст
cppreference написав:Headers required for a freestanding implementation
Types <cstddef>
Implementation properties <limits> <cfloat> <climits> (since C++11) <version> (since C++20)
Integer types <cstdint> (since C++11)
Start and termination <cstdlib> (partial)[1]
Dynamic memory management <new>
Type identification <typeinfo>
Source location <source_location> (since C++20)
Exception handling <exception>
Initializer lists <initializer_list> (since C++11)
Comparisons <compare> (since C++20)
Coroutines support <coroutine> (since C++20)
Other runtime support <cstdarg>
Fundamental library concepts <concepts> (since C++20)
Type traits <type_traits> (since C++11)
Bit manipulation <bit> (since C++20)
Atomics <atomic> (since C++11)[2]
Deprecated headers <ciso646> <cstdalign> <cstdbool> (since C++11)(until C++20)
І на цьому все. А тепер, повернемось в реальність freestanding implementation, де ми не можемо використовувати:
Exception handling, бо в нас немає EH runtime;
Virtual functions, знову через runtime, в нас немає __cxa_pure_virtual();
У нас немає std::string_view, std::span чи навіть std::array (за звичайні контейнери типу std::vector я навіть не говорю, з очевидних причин, там ми впираємось в EH);
У нас немає елементарних примітивів, які потрібні для програмування на С++ – це std::addressof, std::move, std::forward i std::launder;
std::addressof – ви не можете отримати адресу об'єкта, addressof defined in <memory> header, but <memory> is not freestanding. Ви можете сказати, так є ж &, нащо потрібен той addressof? Ну, в С++ є така штука як operator overloading i & може бути перевантаженим;
You cannot move or forward objects;
std::launder – а цього чувака взагалі неможливо реалізувати самому, оскільки це магічна штука;
Так, більшість сучасних компіляторів мають для цієї братії builtin'и, але чи дасть вам хтось гарантії, що у вас вони точно будуть? Пфффф..
std::terminate
You cannot bootstrap cross compile toolchain without stdio.h, GCC, наприклад потребує stdio.h для того, щоб отримати freestanding заголовки.
Підсумовуючи все вище сказане, у кращому випадку ви писатимете, щось типу C with concepts і це ще буде навіть дуже добре. Тобто, різниця, писатимете ви на С чи С++ – не така і велика. Є купа пропозалів, фактично по кожному з цих пунктів, які пропонують ті чи інші шляхи розв'язання проблем, але, хех.. Зате у нас є нова мова програмування Carbon.