|
I'd guess that the mantra "C is for embedded" is mostly because of legacy systems. There was also Embedded C++, which removed templates, exceptions, and RTTI. Memory is now so cheap that C is only justified in small systems.
I wouldn't sign onto a C project unless the team was small and disciplined. The risk of dealing with hacked-together code is simply too great.
"Embedded" is a broad spectrum. At the toaster end, C is fine, but it quickly becomes unjustified as one moves away from that.
|
|
|
|
|
I'd argue that C++ is valid anywhere C is. It's just - you have to know what you're doing to get it to generate the equivalent machine code you would with C.
For example
Anywhere in C you take a handle of any sort, that handle becomes the this pointer of a class's instance methods.
Inline constructors**, and don't initialize things unless they need to be, etc.
Pretty soon you have a C++ rendition of your C code. Same machine code.
** don't actually use the inline keyword, because the compiler doesn't care about it except for linking purposes. I just really mean avoid heavy constructors.
To err is human. Fortune favors the monsters.
|
|
|
|
|
I thought the major concern with C++ rather than C was more memory for C++, not more CPU time. That, at least, was what Embedded C++ addressed. C++ allows almost all of C, so it's just a question of when you need C++ things.
|
|
|
|
|
I think that's only true if you're using the STL. Exceptions also cause hidden overhead, but those things are optional.
To err is human. Fortune favors the monsters.
|
|
|
|
|
Embedded has multiple layers. A tv remote has a microcontroller in it, definitely won't support a C++ program.
GCS/GE d--(d) s-/+ a C+++ U+++ P-- L+@ E-- W+++ N+ o+ K- w+++ O? M-- V? PS+ PE Y+ PGP t+ 5? X R+++ tv-- b+(+++) DI+++ D++ G e++ h--- r+++ y+++* Weapons extension: ma- k++ F+2 X
|
|
|
|
|
Quote: I'd guess that the mantra "C is for embedded" is mostly because of legacy systems. There was also Embedded C++, which removed templates, exceptions, and RTTI. Memory is now so cheap that C is only justified in small systems.
I tend to enforce it on my teams the other way around: provide a real justification for using C++ over C. It becomes very hard to justify using C++ over C for embedded projects that cannot use exceptions, as at that point you're into real implementation-defined behaviour which changes with the compiler being used, or even the flags passed to it.
When C is not suitable for some problem space, I don't find myself reaching for C++ because there are much nicer languages.
C++ is in this weird position - for very small embedded systems, C is better, for very large embedded systems (SBCs, for example), any other high-level language can be used.
For uncrippled C++, the target needs to be larger than atmega level and smaller than Raspberry Pi level. Not a lot of need in that particular niche.
Quote:
I wouldn't sign onto a C project unless the team was small and disciplined. The risk of dealing with hacked-together code is simply too great.
I would.
C is one of the easier languages to unf***k.
A C++ project that was hacked together can be very difficult to reason about (OTOH, A Lisp project that was hacked together may as well be thrown away)
|
|
|
|
|
Our experiences are rather different. I worked on large, embedded systems (call servers) in a proprietary language that could be compared to C, though with better type safety and other things that made it a competitive advantage at the time. And later in the same language after it was extended in much the same way that C was extended to C++.
Having the OO version of the language enabled much clearer frameworks to be defined, which eliminated superfluous diversity when it came to designs. And just like C++/C, legacy, non-OO code could be reused, or the non-OO subset of the language used when appropriate.
Not being able to use exceptions is certainly a problem if using C++, but I don't know why they should be ruled out. They're far better than setjmp /longjmp .
My "hacked together" comment wasn't really about languages, but about the attitude of developers who prefer C over C++. Too many of them are hotshots at the micro level but don't care about the abstractions that are needed in a large system. And I can't really blame them, because doing C++ types of things in C requires more boilerplate than even C++ has.
|
|
|
|
|
On the opposite, forced to work with C , I really miss C++ .
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
I graduated up through the ranks; C, then C++ the C#.
I found going from C to C++ like going from B&W TV to Color.
PartsBin an Electronics Part Organizer is finally available for download.
JaxCoder.com
|
|
|
|
|
Years ago I was asked to write an application to capture information from a mainframe to PC. It had to be written in 8086 Assembler or C as the only available options. So I borrowed a copy of K&R for the weekend and read it through a few times. I started the project the following week and got it working within an acceptable timeframe. I have had a love for C ever since, even though I tend to use C++ and C# for most work these days.
And I do like Python despite its weirdness.
|
|
|
|
|
Three things about C++ that I love more than template :
Overloading, increased type-safety, std:: ,
"If we don't change direction, we'll end up where we're going"
|
|
|
|
|
I do like overloading and increased type safety, but those are things you can find in other languages.
And sure C# has generics but it's just not the same. I can make the C++ compiler dance the tango in a way I just can't with any other language, and it's not me - it's the compiler. Metaprogramming, for example. There's nothing else that really compares to it, at least not in common use.
So that's why I miss them, and why they stand out to me. You can't do it in other languages. It sets C++ apart.
To err is human. Fortune favors the monsters.
|
|
|
|
|
I thought we were comparing C++ vs. C which is why I mentioned those things.
I never had tasks where those wilder template things came into play. However, I've many times seen code, where people out of love for templates, have created totally abhorrable contraptions. I've seen pretty nifty uses as well
If you are into metaprogramming, Haskell comes to my mind as a jewel, but I might be just wronk.
"If we don't change direction, we'll end up where we're going"
|
|
|
|
|
Yeah Haskell doesn't run everywhere or let me get close to the metal.
There's one easy instance I can think of for templates.
In IoT, when you wire up an LCD display, you need to tell your display library/driver what pins its using (and if the driver supports more than one type, what kind of display it is)
With a C app, you would have to set a bunch of defines, which can be done on the command line but is prohibitive when it comes to like 10 of them, leading a lot of people to create a "configuration" header that needs to be modified for one's project.
Worse, because of that, it only supports one display type at a time.
Templates allow for plugging in compile time constants all on a single line if desired, obviating the need for 10 #defines.
More importantly templates allow for statics that are local to the template instantiation allowing you to create static variables that are different for different pin assignments. This then allows you to run multiple displays.
To err is human. Fortune favors the monsters.
|
|
|
|
|
I think you are a very clever guy
Life should not be a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside in a cloud of smoke, thoroughly used up, totally worn out, and loudly proclaiming “Wow! What a Ride!" - Hunter S Thompson - RIP
|
|
|
|
|
I mean, not really. The thing is, I ran face first into this very thing.
It was only after that point at which it occurred to me that I could use templates to create copies of static variables per template-arguments/pin-assignments. Enter use #342 of templates, the swiss army knife of C++ development.
To err is human. Fortune favors the monsters.
|
|
|
|
|
Quote: You can't do it in other languages. It sets C++ apart.
You could do more metaprogramming stuff in Lisp in the 80s than you can do, right now, with C++ templates.
I used to use Lisp quite often (SBCL, sometimes gcl/ecl), and find C++ templates a poor substitute for AST manipulation.
|
|
|
|
|
That's fair, but LISP isn't really in common usage, so there's that. TBH, I didn't know LISP allowed you to do that.
To err is human. Fortune favors the monsters.
|
|
|
|
|
First time I saw C I immediately liked it. The syntax made sense at a gut level. I had Fortran and Basic under my belt at that time, so not a lot of exposure to other languages, but it was non-case locked, and arbitrary length variable names were a godsend.
But I still dislike two items about it. First is the typedef s that surround all struct s in the MS headers. I still don't understand why that was done, although I never delved into it very much.
The second is that everything has to be casted on both sides of the '='. That got old quick.
I still like the language, though. C++ is far betterer! And when I finally understood true OOP in C++ I was in heaven!
|
|
|
|
|
My path was PL/I, Fortran, C. Never did get into C++. The C++ coding I saw from other programmers was inscrutable. In fact, the problem was they all did their own thing when creating objects. I just didn't want to learn to crawl around in their individual sand boxes of objects and classes. True one can get crazy with C but it's twice as crazy in C++.
"A little time, a little trouble, your better day"
Badfinger
modified 14-Sep-22 21:51pm.
|
|
|
|
|
Check out the C++ Object Oriented Programming tutorial in my sig. It may be clear enough to understand some of the additional power that C++ gives you with respect to C (without taking templates into account). If you have suggestions for improvement, holler!
|
|
|
|
|
Thank you, so much for your response, David.
My critique was probably more about the programmers use of C++ than the language.
I did a quick look at your article and found it well organized. Good Job. I made a PDF copy of your article to read offline. BTW your complaints about C are also some of mine.
"A little time, a little trouble, your better day"
Badfinger
|
|
|
|
|
I hope it shines a light on some new stuff for you!
Best wishes!
|
|
|
|
|
BTW I use Codeblocks for my development environment.
It has both a C and C++ environment and works for me.
I also have visual studio 2022 installed but not my choice yet.
Thanks again. "Light" is the appropriate term as lighting simulations was my line of work for many years.
"A little time, a little trouble, your better day"
Badfinger
|
|
|
|
|
David O'Neil wrote: First is the typedefs that surround all structs in the MS headers. I still don't understand why that was done,
Quirkiness of old C standard: when using struct the type is actually
struct type and not type . With ANSI C you would have to declare every variable of type type as
struct type variable; rather than the most sensible
type variable;
A way to get around that is using typedef.
GCS/GE d--(d) s-/+ a C+++ U+++ P-- L+@ E-- W+++ N+ o+ K- w+++ O? M-- V? PS+ PE Y+ PGP t+ 5? X R+++ tv-- b+(+++) DI+++ D++ G e++ h--- r+++ y+++* Weapons extension: ma- k++ F+2 X
|
|
|
|