6

私は C++ で例外を作成して遊んでおり、次のテスト コードがあります。

#include <iostream>
#include <stdexcept>
#include <new>
using namespace std;

class Myerror : public runtime_error {
    private: 
        string errmsg;
    public:
        Myerror(const string &message): runtime_error(message) { }
};

int main(int argc, char *argv[]) {
    throw Myerror("wassup?");
}

私はこれをコンパイルしています:

icpc -std=c++11 -O3 -m64

コンパイル時に、次の ld 警告が表示されます。

ld: 警告: _main でのグローバル ウィーク シンボル __ZN7MyerrorD1Ev への直接アクセスは、実行時にウィーク シンボルをオーバーライドできないことを意味します。これは、異なる可視性設定でコンパイルされた異なる翻訳単位が原因である可能性があります。

icpc の代わりに g++ を使用すると、この警告は表示されません。

これが何を意味するのか、この警告が生成される原因を理解できませんでした。コードは期待どおりに実行されますが、何が起こっているのかを説明したくありません。

4

1 に答える 1

1

次のことを試してください。

#include <iostream>
#include <stdexcept>
#include <new>
using namespace std;

class Myerror : public runtime_error {
    public:
        Myerror(const string &message) throw(): runtime_error(message) { }
        virtual ~Myerror() throw() {}
};

int main(int argc, char *argv[]) {
    throw Myerror("wassup?");
}

なぜ未使用の文字列errmsgが必要なのですか?

于 2013-03-18T14:19:01.957 に答える