clarification of intent WRT shadowing C library

Gabriel Dos Reis Gabriel.Dos-Reis@cmla.ens-cachan.fr
Thu Oct 26 10:28:00 GMT 2000


Benjamin Kosnik <bkoz@redhat.com> writes:

| I had a look at the 26_numerics/c_math.cc failure.
| 
| My initial bug report is here:
| http://gcc.gnu.org/ml/gcc-bugs/2000-10/msg00517.html
| 
| After discussing this with Jason this morning, he proposed the following code:
| 
| extern "C" {
|   extern double sin(double);
| }
| 
| namespace std {
|   extern "C" double sin(double); // 1
|   using ::sin; // 2
| #if 0
|   inline double 
|   sin(double __x) { return ::sin(__x); } //wrong
| #endif
| }
| 
| int main()
| {
|   std::sin(0);
|   sin(0);
|   return 0;
| }
| 
| Where the first option (designated by // 1) is the preferred solution,
| as this explicitly makes the std::sin refer to the extern "C"
| function.

Well, I see Jason's point but I'm not comfortble with it.  We should
proceed in a way so that <cxxx> hearders don't dump C function names
in the global scope.  That is why I'm favouring the _C_legacy namespace
solution.  Yes, it is frustrating the library is not yet functionning
out of box.  Let's try hard.

[...]

| Jason, will this work for structs as well as functions (ie time.h's
| struct tm?) (the answer is no, and the current c_std approach will work.)
| 
| thus
|   inline double 
|   acos(double __x) { return ::acos(__x); }
| 
| should be
|   extern "C" double acos(double __x);


What is wrong with 

  inline double
  acos(double __x) { return _C_legacy::acos(__x); }


?

| and
| #if _GLIBCPP_HAVE_TANF
|   inline float 
|   tan(float __x) { return ::tanf(__x); }
| #else
|   inline float 
|   tan(float __x) { return ::tan(static_cast<double>(__x)); }
| #endif
| 
| should remain intact as they refer to different names.

Yep.

-- Gaby


More information about the Libstdc++ mailing list