This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
stdlib.h abs(long) overload?
- From: Stephan Bergmann <sbergman at redhat dot com>
- To: libstdc++ at gcc dot gnu dot org
- Date: Mon, 03 Mar 2014 17:40:16 +0100
- Subject: stdlib.h abs(long) overload?
- Authentication-results: sourceware.org; auth=none
I discovered that at least with Fedora 20 combination of libstdc++ 4.8.2
and glibc 2.18, including stdlib.h does not make available an abs(long)
overload to abs(int). That is, in a 64 bit environment,
#include <iostream>
#include <stdlib.h>
int main() {
long n1 = -4294967296;
long n2 = abs(n1);
std::cout << n1 << " " << n2 << "\n";
}
prints
-4294967296 0
instead of
-4294967296 4294967296
It works correctly when using cstdlib and std::abs instead, and my
reading of the C++ standards (both 03 and 11) is that including stdlib.h
should make the overload available in the global namespace.
The __CORRECT_ISO_CPP_STDLIB_H_PROTO in the source (apparently only used
for Solaris) makes me assume that this is a known issue. Is the take of
libstdc++ on this that it is a bug in glibc that needs to be fixed
there? (Not sure whether the alternative of working around the glibc
shortcoming in libstdc++, by providing a stdlib.h wrapper, say, would be
feasible at all.)
Clarification welcome,
Stephan