C Ints are Finite Numbers
blogs.freebsdish.org
blogs.freebsdish.org
We all know the C macrolanguage has a ton of shortcomings. But adding all those weird, un-C-like behaviours just makes code harder to understand IMO. You don't expect templates in C code. I don't have anything against C++, but what's the point of C if it just becomes "like C++ but with macro hacks".
If the people responsible for the C standard feel the macrolanguage needs fixing, they have all my support. But let's actually fix the language or design a new one, not add quick hacks that change the semantics of the C code for, IMO, small gains.
This also aren't templates; you still have to write all those variants for a function, and give them unique names.
More importantly, I think this is worth the hassle. Before this, you couldn't really do
typedef double number_t;
and then easily call functions in the standard library such as sin, acos, or pow without having to worry about the actual type of that typedef. _Generic allows library developers to hide the ugliness of having different names for similar functions. That might have been possible using preprocessor metaprogramming, but it certainly wasn't simple.If I want to write "sin(a);" and let the compiler figure out which implementation of sin to use, I can already do that today. I use C++.
It's a bit late to turn C into a strong-ish typed language...
Stagnation in programming languages leads to death, so you would accept that C will eventually die, with C++ being its replacement/killer. That is not necessarily a bad thing, and one could argue that it already is happening (are there still self-hosting C compilers?), but I think it is something one should realize the moment one uses that argument.
I'm not against borrowing features from other languages when they can be ported without affecting the paradigm, but when they do... does it mean the language will die without a specific set of features?
I believe it's the project manager's responsibility to evaluate whether the problems a project will solve can be solved with a specific language before taking the decision to use it.
A language will never be an "all-in-one solution" and forcing a language to solve a problem it was not designed to solve will lead to extra work in the best scenario, ex. String Manipulation in C.
My perception about C is that it was the best option available when it emerged, but newer languages emerged that managed to solve specific problems in a better way than C.
For me this doesn't mean that C is a "dying language", but the completely opposite, C has become a specialized language suitable for use cases where higher level languages mean "expensive overhead", but lower level languages mean "expensive complexity".
then i realised i didn't really know c11. so i checked amazon and there's no c11 harbison + steele. so i just emailed harbison to see if a new edition is planned.
if i get a reply i'll update here.
http://stackoverflow.com/questions/228783/what-are-the-rules...
Update: as another person points out, _Generic is now an official keyword as of C11.
Also, that SO post is about C++, not C. It might seem pedantic (particularly given that C actually does have the same rule for reserved names), but that's something to be careful about as there's significant divergence nowadays.
http://en.wikipedia.org/wiki/C11_(C_standard_revision)
Also, that SO post is about C++, not C.
No, it's about both C++ and C: Because C++ is based on the C standard (1.1/2, C++03) and
C99 is a normative reference (1.2/1, C++03) these also
apply, from the 1999 C Standard...
See section 7.1.3 of the relevant standard:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
Also, the divergence has actually been lessened since the C++11 committee worked closely with the C11 committee to bring the standards closer together.
That's part of why Microsoft is picking up a lot of C99 as part of their work for implementing C++11.
isinf(x)
if (isint(x))
return random() < 0.5
else
...
I think the title makes sense, as it's about c ints being finite, and therefore nobody should be calling "isinf" with them. It was interesting that several codebases were.Yes, but the thing is, they are defined only for floating point types in standard
I struggled to come up with a method which, in C, safely converts a string to an integer type. I finally did it¹, but I've yet to see someone else use this method.
template <typename T>
bool isNumberInfinity(T number)
{
return isinf(number);
}
template <>
bool isNumberInfinity(Number number)
{
return number == Number::INF;
}
So instead of specializing ints, we rely on isinf working for ints, instead of doing the "correct" thing: template <>
bool isNumberInfinity(int number)
{
return false;
}
This is a very contrived since I'm using template functions, which are practically useless, but it holds for any data structure which holds a type that is meant to behave somewhat like a "number".That seems to be the more pressing issue here, not the (long since done) inclusion of a new feature in C!
However in the case of floating point vs integers, it's also likely that a literal is missing a decimal.
1/4 != 1.0/4