int)的 C++ 函数导出为 C 符号?您是否需要注意任何隐藏的陷阱? 以下代码在没有警告的情况下编译,生成的文件有两-6ren">
gpt4 book ai didi

C++ 分配函数以便将其重新导出为 extern "C"

转载 作者:太空狗 更新时间:2023-10-29 20:02:08 25 4
gpt4 key购买 nike

是否可以仅通过分配将具有 C 兼容类型(在本例中为 (int, int) -> int)的 C++ 函数导出为 C 符号?您是否需要注意任何隐藏的陷阱?


以下代码在没有警告的情况下编译,生成的文件有两个暴露的符号。

我很惊讶它能编译,因为我不确定复制函数意味着什么。

namespace simplemath {
int add(int x, int y) {
return x + y;
}
}

extern "C" auto add = simplemath::add;

$ clang++ -Wall -Werror -pedantic --std=c++11 -c example.cc
$ nm example.o
0000000000000000 T __ZN10simplemath3addEii
0000000000000018 D _add

上面的代码是否等同于下面的代码(取决于 simplemath::add 是否被内联)?

extern "C" int add(int x, int y) {
return simplemath::add(x, y);
}

namespace simplemath {
int add(int x, int y) {
return x + y;
}
}

你得到

$ clang++ -Wall -Werror -pedantic -c example.cc
$ nm example.o
0000000000000020 T __ZN10simplemath3addEii
0000000000000000 T _add

最佳答案

不,这通常不会起作用。具有 C 链接的函数和具有 C++ 链接的函数具有不同的类型,即使它们采用相同的参数类型并返回相同的类型。所以函数指针赋值是不合法的。但是,大多数编译器并不强制执行此操作,因此您可能会侥幸逃脱。当然,一旦您升级到强制执行正确语义的编译器,您的代码就会中断。

许多人误解了 C 和 C++ 链接之间的区别,认为这只是名称修改的问题。但不仅如此。例如,编译器可以对两个不同的链接使用不同的调用约定,在这种情况下,您无法在 C 代码中使用指向 C++ 函数的指针。 extern "C" 告诉编译器编译函数,以便它可以从 C 中调用。

关于C++ 分配函数以便将其重新导出为 extern "C",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45968246/

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