0

以下に示すように、関数ポインターを引数として受け取り、関数ポインターを呼び出す関数があります。

int foo (int a, int(*calc)(int))
{
    int y;
    // ....
    // calling calc function via callback
    (*calc)(y);
}

コールバックされる calc 関数は次のようになります

int calc(int x)
{
    // ....
    cout << x; 
    checkValue(x);
}

functionfooa.cppおよび functionに配置され、ファイルcalc()およびでcheckValue()定義されます。私の問題は 、ステートメントまで正常に実行され、関数の呼び出しに失敗することです。私が受け取ったクラッシュレポートは次のとおりです。b.cppc.cppcalc()coutcheckValue()

symbol lookup error:..... undefined symbol: _ZNSaIcEC1Ev, version GLIBCXX_3.4

どうすればこの問題を解決できますか?

4

2 に答える 2

0
#include <iostream>
using namespace std;

int calc(int x){
  cout<< "calc:" << x << endl;
}

int CALC(int x) {
    cout << "CALC: " << x << endl;
}


int foo (int a, int(*callback)(int)){
    cout << "Calling calc on:" << a << endl;
    (*callback)(a);
}

int main() {
    cout << "START" << endl;

    foo(5, calc);
    foo(6, CALC);
}

これは私にとってはうまくいきます。

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00)

注:「checkValue(x)」呼び出しを削除しました。問題はそこにある可能性があります...

于 2013-06-03T19:46:30.073 に答える
0

シンボルは、引数のないコンストラクター_ZNSaIcEC1Evのマングル名です(プログラムを使用してこれを決定しました)。エラー メッセージ " " は動的リンクに関するものであり、関数ポインタを介した関数の呼び出しとは関係ありません。std::allocator<char>::allocator()c++filt(1)symbol lookup error:..... undefined symbol

あなたのエラーはほぼ確実に別の場所にあります。おそらく、 stdout バッファリングが原因でエラーの場所について混乱しているでしょう。文字列は stdout に出力されていますが、メモリにバッファリングされているため表示されず、プログラムがクラッシュする前にクラッシュします。表示されます。これを回避するには、すべての print ステートメントの後に出力をフラッシュすることを確認する必要があります (たとえば、または明示的に を挿入std::cout << std::endlするstd::cout << std::flushことによってstd::cout.flush()) 。std::cerrstd::cout

于 2013-06-03T20:47:10.900 に答える