假设我不使用任何重载函数,有没有办法可以阻止所有名称修改? [复制]

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。无论如何,它对课程不起作用!

以上是关于假设我不使用任何重载函数,有没有办法可以阻止所有名称修改? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法阻止派生类进一步实现虚函数?

从派生类调用重载函数

有没有办法阻止 discord.py 机器人提及角色?

Java构造方法

有没有办法用 HTTPS 加密主机头?

有没有办法阻止 SVN 的任何变化?