2014-05-01 3 views
5

Ich habe eine große Codebasis, die die C++ <complex> Header und viele std::complex<double> Objekte verwendet. Aber jetzt möchte ich auch ein paar andere Bibliotheken verwenden (fftw und spinsfast), die <complex.h> verwenden. Leider scheint das Mischen dieser zwei Arten von Komplexen mit gcc 4.6.1 (vermutlich unter anderen) inkompatibel zu sein.C++ <complex> und <complex.h> in der gleichen Datei

Hier ist ein minimales Arbeitsbeispiel zeigt den Fehler:

// This is what I do for my various complex objects 
#include <complex> 

// This is one of many things FFTW/spinsfast essentially do 
extern "C" { 
    #include <complex.h> 
} 

int main() { 
    std::complex<double>(1.0,2.0); 
    return 0; 
} 

Und wenn ich kompiliere:

> g++ test.cpp -o test 
test.cpp: In function ‘int main()’: 
test.cpp:7:8: error: expected unqualified-id before ‘_Complex’ 
test.cpp:7:8: error: expected ‘;’ before ‘_Complex’ 

Offensichtlich gcc std::complex<double> in _Complex ist die Übersetzung, die irgendwie auch nicht definiert ist. [Das funktioniert gut auf meinem MacBook, das Apple LLVM Version 5.1 verwendet; Dieser Compilerfehler tritt bei einem Cluster auf, den ich unterstützen muss.]

Ich kann nicht einmal herausfinden, woher das kommt; Keine der Include-Dateien in meiner GCC-Installation haben "_Complex" - obwohl sie "_ComplexT" haben. Wie debugge ich so etwas?

Oder hilfreicher, wie löse ich diesen Compiler Fehler in einer Weise, die für mehr als nur ein kleines Stück von gcc s funktioniert?

+1

Haben Sie versucht, sowohl '' als auch '' anstelle von '' einzuschließen? – Manu343726

+0

Es scheint, als ob 'complex.h'' complex' definiert als '_Complex' nach http://pubs.opengroup.org/onlinepubs/009695399/basedefs/complex.h.html – leemes

+3

Kein Problem hier mit gcc 4.8.2. Außerdem benötigen Sie normalerweise nicht den 'externen' C '{} '- Wrapper um Standard-Bibliotheksheader, da die Header normalerweise so geschrieben sind, dass sie entweder unter C oder C++ funktionieren, aber überprüfen Sie Ihre speziellen Header. – Edward

Antwort

7

In C ist _Complex ein Schlüsselwort zum Deklarieren komplexer Zahlen: float _Complex. Aber sie #define complex _Complex so können Sie float complex schreiben, die schöner aussieht.

Natürlich erhalten Sie in Schwierigkeiten, wenn Sie den Namen complex in einem Zusammenhang mit anderen als, wo Sie wollen _Complex, wie std::complex, die dann zu std::_Complex erweitert.

Also, wenn Sie <complex> in C++ verwenden, sollten Sie die Befreiung von diesem Makro erhalten:

#include <complex.h> 
#undef complex 

, die tatsächlich ist, was g ++ ist seit 4,8 bis sowohl <complex> und <complex.h> in derselben Übersetzungseinheit zu unterstützen.

Beachten Sie, dass Sie beim Aktivieren von C++ 11 auch keinen Fehler erhalten.

+0

Hm. Das funktioniert in meinem MWE, in Ordnung, aber in meinem echten Code bekomme ich 'error: no match for call to '(std :: complex ) (double, double)''. Vielleicht war mein MWE zu M ... – Mike

+1

Nun, indem ich meine Includes neu anordne und jede Variable namens 'I' lösche, scheint das alles jetzt zu funktionieren ... Danke! – Mike

+2

Das Problem mit 'I' steht im Zusammenhang mit http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59087 und wie du vermutet hast, ist es das Beste, I in deinem Code einfach zu vermeiden. –

Verwandte Themen