C++ 假设我没有';如果我不使用任何重载函数,有没有一种方法可以阻止所有名称损坏?

C++ 假设我没有';如果我不使用任何重载函数,有没有一种方法可以阻止所有名称损坏?,c++,c,name-mangling,C++,C,Name Mangling,标题几乎说明了一切。我知道我可以使用和外部的“C”块来停止损坏(虽然我不完全确定我应该把这个块放在哪里),但是有没有一种方法可以在整个程序中禁用它?如果我这样做了,这会使从代码编译的库更容易与luajit的FFI之类的东西一起使用吗 编辑:这个假设是复制的问题是特定于DLL和VisualC++编译器的。我只是在问一个普通的C++问题。 ,正如你提到的,使用外部“C”{} //>语法来禁用你不必为的名字进行修改的函数声明。 extern "C" { int foo(int x, int y

标题几乎说明了一切。我知道我可以使用和外部的“C”块来停止损坏(虽然我不完全确定我应该把这个块放在哪里),但是有没有一种方法可以在整个程序中禁用它?如果我这样做了,这会使从代码编译的库更容易与luajit的FFI之类的东西一起使用吗


<>编辑:这个假设是复制的问题是特定于DLL和VisualC++编译器的。我只是在问一个普通的C++问题。

,正如你提到的,使用<代码>外部“C”{} //>语法来禁用你不必为

的名字进行修改的函数声明。
extern "C" {
    int foo(int x, int y);
    void bar(const char* cstr); 
}

更简单的方法,如果你确信你没有使用任何C++特定的特性,就是使用C编译器编译你的代码。例如,GCC工具链调用

GCC
而不是
g++

更新:
ExtNe/Cuff>方法的优点是,仍然可以使用C++特性来实现(在单独的<代码> .CPP编译单元)中,编译纯代码时,当然是不可能的。例如

#include "MyExportAPI.h"
#include <string>

void bar(const char* cstr) {
    std::string s(cstr); // <<< Note!
}
#包括“MyExportAPI.h”
#包括
空栏(常量字符*cstr){

std::string s(cstr);//只需使用c编译器(gcc而不是g++)编译你的代码。然后我不能使用类或继承。我在回答中解释了使用
extern
语法的优点。没有办法全局打开它,这很好。这样你就可以准确地选择,哪些函数名应该作为导出的c API保持不混合。它是重复的,但是是。投票重新打开重新关闭。是的,我想是这样。我肯定错过了。当然,你需要写C++而不是C++来做。@无用的,代码>外部的“C”/代码>函数仍然可以用C++实现……是的,“这个”指的是使用gcc,pre-edit。那么我应该在外部块中包装什么呢?我不能把整个类都放在外部块中。@在那里包装全局函数声明的代码可以用作c API。无论如何,它对类都不起作用!