c++ virtual - Come eseguire il dllexport di una classe derivata da std::runtime_error?





metodo virtuale (2)


Ci sono alcune opzioni per te in questo tipo di situazione.

  1. Esportalo.
  2. Ignoralo.
  3. In linea.

È importante ricordare che il modo "corretto" per esportare la classe da una dll è esportare l'intera classe, comprese le basi e i membri. Per questo motivo ci sono diverse tecniche come questa su CodeProject , che usano una "interfaccia" e una factory appropriata per creare la classe (e la distruzione corrispondente).

Questo non è troppo utile per te in questa situazione, provare ad esportare std::runtime_error è probabilmente uno sforzo maggiore e probabilmente introdurrà problemi ancora più grandi in seguito.

Tratto dal sito Microsoft Connect qui ( webarchive ), la famiglia di questi errori è essenzialmente rumore;

Consiglio di evitare questo problema in primo luogo, poiché i tipi di STL nell'interfaccia della tua DLL ti obbligano a giocare secondo le regole della STL (in particolare, non puoi mescolare diverse versioni principali di VC e le tue impostazioni IDL devono corrispondere). Tuttavia, c'è una soluzione alternativa. C4251 è essenzialmente rumore e può essere silenziato ...

Stephan T. Lavavej (uno dei manutentori della libreria C ++ di Micrsoft).

Fintanto che le opzioni del compilatore sono coerenti nel progetto, è sufficiente silenziare questo avviso.

L'ultima opzione è definire la classe BaseException linea e non esportarla affatto.

Nella mia esperienza, l'opzione inline è quasi sempre stata la più facile per le classi di eccezioni.

Le modifiche al runtime C ++ per VS2015 hanno portato a modifiche nell'esportazione di std::exception (non viene esportato dal runtime).

L'opzione inline ora sembra essere la più appropriata in questo momento (il tuo chilometraggio può variare).

Ho creato una libreria che fornisce una classe di eccezione derivata dall'eccezione standard:

#include <stdexcept>
#include <string>

class BaseException : public std::runtime_error
{
    public:
        BaseException( std::string const & msg );
};

Fin qui tutto bene. Compila e gestisce abbastanza bene su Unix. Ora sto preparando questo per la compilazione in una DLL di Windows:

#ifdef WIN32
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif

#include <stdexcept>
#include <string>

class MY_EXPORT BaseException : public std::runtime_error
{
    public:
        BaseException( std::string const & msg );
};

Tuttavia, questo mi avvisa C4275 : non – DLL-interface class 'std::runtime_error' used as base for DLL-interface class 'BaseException' .

E sfortunatamente, sono un po 'allergico alla documentazione in stile Microsoft: eccessivamente prolisso, e non molto al punto. Continua a lasciarmi completamente confuso su ciò che è effettivamente previsto da me per risolvere il mio problema.

Qualcuno di voi può illuminarmi? Potrei semplicemente abbandonare la classe base, ma poi prendere std::runtime_error o std::exception non catturerebbe la mia classe di eccezioni personalizzata, e preferirei che fosse possibile. Così...?




Come questo:

#include <vector>

// ...

std::vector<std::vector<int>> A(dimension, std::vector<int>(dimension));

(Pre-C ++ 11 è necessario lasciare uno spazio tra le parentesi angolari).





c++ windows exception dll dllexport