2016-05-13 14 views
1

Ich portiere einen Code von Windows zu CentOS, aber ich konfrontiere mit einem Problem, das ich nie zuvor gesehen habe.Sichtbarkeit mit werfen und geteilte Objekte

Da Funktionsdeklaration (es gibt viele mehr):

byte getValueInt8() const throw(.../*Exception*/); 

ich diesen Fehler:

error: expected type-specifier before ‘...’ token unsigned short getValueInt8() const throw(.../*Exception*/); 

Natürlich habe ich das Internet eingecheckt haben, und ich habe festgestellt, dass es ein Sichtbarkeitsproblem in geteilten Objekten.

Diese Website https://gcc.gnu.org/wiki/Visibility erklärt das, aber ich hatte dies bereits getan, als ich es gelesen habe.

Meine definiert sind:

#if defined(_MSC_VER) 
#include <winsock2.h> 
    #ifdef MFTINTERFACE_EXPORTS 
     #define EXPORT_IMPORT __declspec(dllexport) 
    #else 
     #define EXPORT_IMPORT __declspec(dllimport) 
    #endif 
#elif defined(_GCC) 
    #include <arpa/inet.h> 
    #include "CmnSocketsDef.h" 
    #include "CmnDefs.h" 
    #define EXPORT_IMPORT __attribute__((visibility("default"))) 
#else 
    #define EXPORT_IMPORT 
    #define IMPORT 
    #pragma warning Unknown dynamic link import/EXPORT_IMPORT semantics. 
#endif 

Natürlich sind alle EXPORT_IMPORT sind in meinem Code gut eingestellt.

Der Code vor der Änderung kompiliert in Windows.

Irgendwelche Ideen?

Dank

+0

'throw (...)' bedeutet, dass die Funktion * jede * Ausnahme auslösen können . Das ist ähnlich, als hätte man überhaupt keine Ausnahmebestimmung. –

Antwort

2

throw(...) als eine Ausnahme-Spezifikation nicht legal C++ ist.

Ich kann nur annehmen, dass Sie eine Microsoft Abscheulichkeit Erweiterung gefunden haben.

Sie müssen es entfernen. In jedem Fall ist der einzige Ausnahme-Spezifizierer, der in der Realität Sinn macht, nothrow (oder throw(), wenn Sie einen alten Compiler verwenden).

der Tat, hier ist die smoking gun:

https://msdn.microsoft.com/en-us/library/wfa0edys.aspx

Vorschlag deprecate:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3051.html

+0

Ok vielen Dank! Ich lösche alle diese Würfe dann! – Render

+0

@Render ja, lösche alle 'throw (...)' Anweisungen. Lasse die 'throw()' ein, wie sie vorschreiben, dass die Funktion nichts werfen darf. Sie können diese in 'nothrow' konvertieren, da' throw() 'veraltet ist. –

+0

Eigentlich werde ich nicht. Ich habe gerade mit verschiedenen Dateien gesehen, dass nach "..." andere Informationen als/* Exception */vorhanden sind. Es ist ein Strukturtyp, also werfe ich es. Ich habe gerade ein Stück Code geändert und es funktioniert – Render