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

functionfoo放在a.cpp和 function中calc(),并checkValue()在文件b.cppc.cpp. 我的问题是 calc()在语句之​​前执行良好cout并且无法调用checkValue()函数。我收到的崩溃报告是:

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

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

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

于 2013-06-03T20:47:10.900 回答