我想演示我的项目的一小部分示例,在该示例中,访问外部extern“ C ++”定义的函数时收到Linker错误。如果我的项目同时允许C和C ++链接,那么访问此功能的最佳方法是什么?
///文件名:new
#include <cstdlib>
#include <exception>
extern "C++" {
namespace std
{
typedef void (*new_handler)();
new_handler set_my_handler(new_handler) throw();
}
///文件名:main.c
extern void handler();
void main()
{
handler();
}
///文件名:App.cpp
#include <new>
static App objApp;
void no_memory()
{
// exit
}
void App::init()
{
using namespace std;
set_my_handler(no_memory);
}
extern "C" void handler()
{
objApp.init();
}
我收到以下链接器错误:
../../ obj / output / stm32-debug / Project / App.o:在函数App :: init()中:对set_my_handler(void(*)())的未定义引用
在库中,较早的“ set_my_handler”被定义为extern“ C”,但现在其extern“ C ++”。我还没有看到过多使用extern“ C ++”来限制仅从C ++链接进行的调用。但是在我的项目中,我有一个C函数,该函数最终访问在外部“ C ++”下描述的C ++函数。好奇链接器为何如上所述哭泣。
观察:如果我不调用objApp.init()[即将此行注释掉]我不 得到任何链接器错误。问题与从C到C的呼叫流有关 C ++函数标记为extern“ C ++”。