The easy problem in SRM 685 is the N-th time I failed because of using __builtin_popcount
instead of __builtin_popcountll
. As a result, a new line has been added to my template code:
#define __builtin_popcount __builtin_popcountll
Btw, does anyone have an idea why C++ doesn't merge the 2 above functions into one to avoid such silly mistakes?
The reason that you have 2 different functions is that,
__builtin_popcount
and__builtin_popcountll
are defined in C. In C, unlike C++, you don't have function overloading. For example, you can't do the following in C:Thus, you have 2 different functions. The same happened with
abs
,llabs
,fabs
..But
abs(123.5)
still returns 123.5 though. Usingabs
forlong long
also works as well.Are you trying C++ or C? In C++ it works, as they redefined
abs
function (see reference). In C, the following code proves my point:Ops, I thought you meant C++.
So what the problem to redefine __builtin_popcount in C++?
in C11 you have a special feature called "generic selection" for such cases: