

C Legacy Is Evil - ikalnitsky
http://kalnitsky.org/2014/10/25/c-legacy-is-evil/

======
millstone
> If you wrote your own struct in C++, you have to define constructor to
> initialize all members with some default values.

No you don't. You are free to define a constructor that leaves some fields as
garbage; in fact that's the default behavior.

------
notacoward
Yes, it's possible to make mistakes in C. News at 11. Some mistakes are unique
to C, some are shared with C++, and a _bloody huge heap of them_ are unique to
C++. What is proven by picking one bug from the first or second bucket and
ignoring the third?

------
patmcguire
As long as we're purging evil legacy, this particular bug could also be solved
by getting rid of daylight savings time and updating the struct accordingly.

------
stephencanon
Of course, in C you'd just use designated initializers and avoid the problem
entirely (any unspecified fields are zero-initialized).

~~~
mamcx
Bad correlation.

This is about a bad language that force GOOD developers to figth against it.

"Always use memset onto struct variable before usage, because by default it's
filled with garbage."

See? The language PUT GARBAGE on your code. Good or bad developer, not matter.

Now, a more _experienced_ developer will remember that it need to correct the
problems the language force on ALL the users.

Not all the blame is in the people. Somethings, the tools are at fault, too..

~~~
ChrisAntaki
The language just gave you a block of memory. It lets you decide whether you'd
like to dedicate resources to clearing that memory.

~~~
mamcx
Ok, so for what is usefull to have garbage after get memory?

~~~
J_Darnley
Why do I need to zero an image array if I am about render something into it?
You spend time setting each byte to zero.

~~~
mamcx
I understand if I get null/empty... but garbage?

And in relation to this post, the behaviour is not the same across
compilers/archs? Thats nuts.

~~~
notacoward
Welcome to programming in the real world. If that's the nuttiest thing you
have to deal with on any given day, it's a good day.

~~~
mamcx
Yep, I know programing is hard. +18 years of it.

Is crazy the amount of punishment a developer accept, and when the fail is
elsewhere, it blame itself ;)

------
yongjik
I'm sure Bjarne Stroustrup (and the C++ committee) had enough time and
resource to mandate that structures are zero-initialized, if they were so
inclined. (I mean, think about it: any time you read from an uninitialized
value is an undefined behavior, so no conforming program will be broken by
this change. Literally.)

The fact that they didn't tells me that this was a conscious decision, not
some "Legacy C" cruft that's left there for the sake of backward
compatibility. And indeed the core tenet of C++ is "You only pay for what you
use", isn't it? Zero-initializing a struct would be against C++'s philosophy.

------
JoeAltmaier
I clear structs using a template; saves copying and screwing up the length:

template <class C> SPL_INLINE_FORCE void Zero(C &c) { memset(&c, 0,
sizeof(c)); }

struct tm tm_struct;

Zero(tm_struct);

~~~
dezgeg
There's also a way to do this without any user-defined functions that works in
both C and C++:

    
    
        struct tm tm_struct = { 0, };

~~~
JoeAltmaier
Does that work on char array members in the struct?

~~~
dezgeg
Yes, as far as I believe, this should always work in standard C89/C99. In the
char array case, it works due to the brace elision rule in aggregates:
assuming

    
    
        struct foo { char bar[3]; };
    

These declarations are equivalent:

    
    
        struct foo f1 = { 0, };
        struct foo f2 = { { 0, } };

------
throwaway7808
At least in C your initialization functions are first class citizens. Not like
in that messed-up language, in which a constructor just should not fail...

~~~
thegeomaster
What do you mean by "a constructor just should not fail?" Constructors can and
do fail in C++.

------
Sonicmouse
I don't get it?

He didn't initialize a struct properly, results in errors...

Conclusion: C is evil?

