假设我不使用任何重载函数,有没有办法可以阻止所有名称修改? [复制]
Posted
技术标签:
【中文标题】假设我不使用任何重载函数,有没有办法可以阻止所有名称修改? [复制]【英文标题】:Assuming I don't use ANY overloaded functions, is there a way I can stop ALL name mangling? [duplicate] 【发布时间】:2014-06-05 12:18:07 【问题描述】:标题几乎说明了一切。我知道我可以使用和 extern "C" 块来停止修改(虽然我不完全确定我应该把所说的块放在哪里)但是有没有办法可以为整个程序禁用它?如果我这样做了,这是否会使从代码编译的库更容易与 luajit 的 FFI 之类的东西一起使用?
编辑:这应该是重复的问题是特定于 DLL 和 Visual C++ 编译器的。我只是在问一个一般的 C++ 问题。
【问题讨论】:
只需使用 c 编译器(gcc 而不是 g++)来编译您的代码。 那我就不能使用类或者继承了。 我在回答中解释了使用extern
语法的好处。没有办法在全局范围内打开它,这样很好。这样你就可以准确地选择,哪些函数名称应该作为导出的 c API 保持不变。
这是一个重复的,但 this。投票重新开放以重新关闭。
是的,我想这是真的。我一定错过了那个。
【参考方案1】:
正如您所提到的,使用 extern "C"
语法禁用名称修饰来包围您不希望有修饰名称的函数声明
extern "C"
int foo(int x, int y);
void bar(const char* cstr);
如果您确定没有使用任何 c++ 特定功能,更简单的方法是使用 c 编译器来编译您的代码。例如GCC 工具链调用 gcc
而不是 g++
。
更新:extern
方法的优点是您仍然可以使用 c++ 功能来实现(在单独的 .cpp
编译单元中),这在将您的代码编译为纯 c 代码时当然是不可能的。例如
#include "MyExportAPI.h"
#include <string>
void bar(const char* cstr)
std::string s(cstr); // <<< Note!
【讨论】:
当然,您需要编写 C 而不是 C++ 来执行此操作。 @Useless no,extern "C"
函数仍然可以使用 C++ 实现...
是的,"this" 指的是使用 gcc,预编辑。
那么我应该在外部块中包装什么?我不能把整个班级都放在一个外部块中。
@thecodethinker 你在那里包装全局函数声明,可以用作 c API。无论如何,它对课程不起作用!以上是关于假设我不使用任何重载函数,有没有办法可以阻止所有名称修改? [复制]的主要内容,如果未能解决你的问题,请参考以下文章