具有分层控制的函数指针用法:xtern/命名空间C++



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

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++ 的文件。请注意,它是 extern "C++",在 Stackoverflow 或 Google 上没有太多关于 extern "C++" 用法的信息。

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

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


虽然这一点在评论中已经敲定了,但值得注意的是,不允许在命名空间std中定义自己的名称。据推测,您引用的代码来自设计用于独立环境的库实现。使用命名空间std与问题无关,只是分散了您对问题的注意力。

这是从 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
}

最新更新