This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: C99 _Complex and C++ complex<> interoperability.


Howard Hinnant wrote:
On Feb 22, 2007, at 1:25 PM, Smith-Rowland, Edward M wrote:

My questions are:
 Is this behavior standard or is this a gcc extension?
 If this is a gcc extension where is it documented?

Also, if this behavior is nonstandard is anyone thinking about
standardizing it?
Finally, the circle would be complete if we could assign from
std::complex to _Complex.
Any ideas?  There is a private functions that return _Complex from
std::complex.

Fwiw here are some relevant links:


http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#387

The above link is a C++ committee library working group defect report on this subject. It is in an open state meaning that no decision has been made.

Below is a link to a paper which further discusses (really just summarizes) the issue:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1589.html

In a nutshell, there is support on the C++ committee for making the C++ and C99 complex types layout compatible. I'm not aware of support for making them API compatible. Currently C++ will not parse the syntax for C99 complex types and I know of know proposal to do so.
Actually, g++ happily accepts a mixture of things like "std::complex<float>" and "double _Complex" as the code attached to the first mail demonstrates. I will attempt to see if this compiles on Visual Studio 2005.

It actually doesn't surprise me that these types could appear side by side - "double _Complex" is a built in type like double as far as C99 is concerned and of course std::complex<> is just another type. I think that for C and C++ compilers that share a common codebase this is not a stretch in practice.

I was a little more surprised that C++ complex vars could take assignments from C99 complex and the C++ ctors could take C99 input.

I guess I'll come out and say it: I think the feature of having C++ standard complex variables accept input from C99 complex numbers is a good idea in the interest of interoperability. Getting the C++ powers to accept _Complex as a new keyword might be a bit of a challenge though ;-). But it would make using C libraries within C++ easier.

If this was an accident or an experiment in gcc that will never be standard I still think we should put it up as an extension in the docs.
However if the complex types were layout compatible one could link C99 and C++ sources and have them refer to the very same complex data structures, even passing them back and forth (just referenced with different syntax in the different translation units).
I really also would add a strong vote to mandate the complex layout - contiguous real complex - as standard.
I think I speak for at least some people in the GSL and other scientific communities too.
-Howard


As long as I'm voicing my opinion on such matters (FWIW) I would go for std::complex<T>::set_real(T) and std::complex<T>::set_imag(T) if only lvalue functions are a tad untraditional in C++.


Ed


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]