C ++回调函数运行时错误

时间:2013-06-03 19:40:18

标签: c++ linux callback g++

我有一个接受函数指针作为参数的函数,并调用函数指针,如下所示。

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);
}

函数foo放在a.cpp中,函数calc()checkValue()在文件b.cppc.cpp中定义。我的问题是calc()cout语句之前执行正常,并且无法调用checkValue()函数。我收到的崩溃报告是:

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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)”电话,问题可能就在那里......

答案 1 :(得分:0)

符号_ZNSaIcEC1Evstd::allocator<char>::allocator()零参数构造函数的错位名称(我使用c++filt(1)程序确定了这一点)。错误消息“symbol lookup error:..... undefined symbol”与动态链接有关,与通过函数指针调用函数无关。

你的错误几乎肯定在其他地方。由于 stdout缓冲,你可能会对错误的位置感到困惑 - 字符串被打印到stdout,但是你没有看到它们出现,因为它们被缓冲在内存中,然后程序在显示之前崩溃。为避免这种情况,您需要确保在每个print语句后刷新输出(例如,通过插入std::cout << std::endlstd::cout << std::flush或显式调用std::cout.flush()),或使用std::cerr而不是std::cout,默认情况下是无缓冲的。