具有分层控制的函数指针用法:xtern/namespace C++
Function pointer usage with hierarchical control: xtern/namespace C++
Below is a sample usage from an older and newer version of a software stack. How would the function usage and access differ with the hierarchical structuring of the two pieces of
code below:
namespace std
{
typedef void (*function)();
extern "C" function fn_ptr(function) throw();
}
和
extern "C++"
{
namespace std
{
typedef void (*function)();
function fn_ptr(function) throw();
}
}
The first one is easy but I wish to access fn_ptr from both C and
C++ based files in the 2nd example. Note that it is extern "C++" and there isn't much to find about extern "C++" usage on Whosebug or Google.
第二个版本不允许从用 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!
}
Do the following steps now (to be able to call the above function from
a .c file):
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
}
Below is a sample usage from an older and newer version of a software stack. How would the function usage and access differ with the hierarchical structuring of the two pieces of code below:
namespace std
{
typedef void (*function)();
extern "C" function fn_ptr(function) throw();
}
和
extern "C++"
{
namespace std
{
typedef void (*function)();
function fn_ptr(function) throw();
}
}
The first one is easy but I wish to access fn_ptr from both C and C++ based files in the 2nd example. Note that it is extern "C++" and there isn't much to find about extern "C++" usage on Whosebug or Google.
第二个版本不允许从用 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!
}
Do the following steps now (to be able to call the above function from a .c file):
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
}