通过分层控制使用函数指针:xtern / namespace C ++

时间:2018-07-19 22:47:12

标签: c c++11 pointers function-pointers extern

  

下面是旧版本和较新版本的软件堆栈中的示例用法。函数的使用和访问方式与这两部分的层次结构有何不同   下面的代码:

namespace std
{
    typedef void (*function)();
    extern "C" function fn_ptr(function) throw();
}

还有

extern "C++" 
{
  namespace std
  {
      typedef void (*function)();
      function fn_ptr(function) throw();
  }
}
  

第一个很简单,但是我希望从C和C都访问fn_ptr   第二个示例中基于C ++的文件。请注意,它是外部“ C ++”,在Stackoverflow或Google上没有太多关于外部“ C ++”用法的信息。

2 个答案:

答案 0 :(得分:1)

第二个版本不允许直接用C编写的程序进行访问。

当然,没有什么能阻止C程序调用其他声明为extern "C"的C ++函数,而该函数又会调用std::fn_ptr


尽管这一点已在注释中扎根,但值得注意的是,不允许您在名称空间std中定义自己的名称。大概您引用的代码来自旨在用于独立环境中的库实现。使用名称空间std与该问题无关,而只是分散您的问题。

答案 1 :(得分:0)

这是从C访问用C ++定义的函数的独特方法。extern“ C ++”在默认情况下是默认的。

让我们假设您有一个.c文件(FileC.c),并且希望调用在.cpp(FileC ++。cpp)中定义的函数。让我们在C ++文件中将函数定义为:

void func_in_cpp(void) 
{ 
  // whatever you wanna do here doesn't matter what I am gonna say!
}
  

现在请执行以下步骤(以便能够从中调用上述功能   .c文件):

1)使用常规的C ++编译器(或www.cpp.sh),编写一个包含您的函数名称(func_in_cpp)的非常简单的程序。编译程序。例如。

$ g++ FileC++.cpp -o test.o

2)查找函数的错误名称。

$ nm test.out | grep -i func_in_cpp
[ The result should be "_Z11func_in_cppv" ]

3)转到您的C程序并做两件事:

void _Z11func_in_cppv(void);  // provide the external function definition at the top in your program. Function is extern by default in C.

int main(void) 
{
    _Z11func_in_cppv();   // call your function to access the function defined in .cpp file
}