gpt4 book ai didi

c++ - 从 C 库调用 C++ 函数指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:23 24 4
gpt4 key购买 nike

我有一个只有静态成员的类。

我想使用“atexit”库函数注册它的一个成员函数(下面代码中的 VerifyClean)以在退出时调用。

C++ FQA说我必须为我想以这种方式注册的函数指定 extern "C",如下例所示。

class Example
{
public:
static void Initialize();
static void DoDirtyStuff {++dirtLevel;}
static void CleanUpStuff {--dirtLevel;}
private:
static void VerifyClean();
// DOESN'T COMPILE: extern "C" static void VerifyClean();
static int dirtLevel;
}

int Example::dirtLevel;

extern "C" void Example::VerifyClean() // DO I NEED extern "C" HERE?
{
assert(dirtLevel == 0);
}

void Example::Initialize()
{
dirtLevel = 0;
atexit(&VerifyClean);
}

我真的必须使用 extern "C"吗?

如果我用非库函数(在普通 C 中实现)替换“atexit”,答案会改变吗?

如果函数 VerifyClean 是公开的并且我决定直接从 C++ 代码调用它,我会遇到链接错误或运行时崩溃吗?我问这个是因为声明根本没有提到 extern "C",所以常规的 C++ 代码可能会错误地处理函数调用。这在我的 MS Visual Studio 2005 系统上工作正常。

最佳答案

编译器可能对 C 和 C++ 代码使用不同的调用约定;然而,在实践中,这几乎从未发生过。

如果您只是想让它工作而不关心支持晦涩的编译器,请不要为 extern "C" 而烦恼。在任何广泛使用的编译器中都没有必要。

如果你想绝对迂腐,或者需要支持迂腐的编译器,写一个包装器:

extern "C" static void ExampleVerifyClean()
{
Example::VerifyClean();
}

void Example::Initialize()
{
dirtLevel = 0;
atexit(&ExampleVerifyClean);
}

关于c++ - 从 C 库调用 C++ 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4198092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com