如何在 C++ 中包含多语言开发 header

How to include multiple language development header in C++

我想将 Python.hruby.h header 包含在同一个 C/C++ 文件中,因为我想同时使用这两个文件.哪种方法最好同时包含两者并防止 compiler/preprocessor 警告相同变量的多次重新定义,或者还有另一种方法可以使用 C 中的这些语言?

MWE:

// file.cpp

#include <iostream>
#include <Python.h>
#include <ruby.h>

int main() {
  return 0;
}

我从预处理器发出这样的警告:

In file included from /path/to/Python/include/Python.h:8,
                 from /path/to/file.cpp:4:
/path/to/Python/include/pyconfig.h:61: warning: "HAVE_HYPOT" redefined
 #define HAVE_HYPOT

In file included from /path/to/Ruby/include/ruby-2.7.0/ruby/ruby.h:24,
                 from /path/to/Ruby/include/ruby-2.7.0/ruby.h:33,
                 from /path/to/file.cpp:5:
/path/to/Ruby/include/ruby-2.7.0/x64-mingw32/ruby/config.h:211: note: this is the location of the previous definition
 #define HAVE_HYPOT 1

不确定 python.h 中的内容,但由于 python 是一种解释型语言,我假设 python.h 引用的目标代码解释了 python 作为文本保存的代码C++ 代码中的数据如

char * pythonScript = "print \"Hello, World!\"";
pythonExec(pythonScript);

Python 是一种解释型语言(至少在 linux 上是这样),也是 c++ 编译器的外语。

我唯一一次看到 c++ 直接支持外语是依赖于实现的 asm 关键字,其中一些编译器允许您将汇编语言代码块直接写入 C++ 源代码。并非所有编译器都支持它,而 asm 是我唯一一次看到这种支持方式。

值得商榷的是,像 opengl 这样的东西本身就是语言,并且在某种意义上有一种外语支持方式,即每个 opengl 函数和变量都用 c++ 函数或变量复制到完整语言的程度映射到 C++。

抱歉,我没有完整的答案,但考虑到我认为你正在尝试做的事情并没有得到真正的支持,我希望它能为你提供一些指导,让你知道应该去哪里。

也许有人有更好的答案。

编辑:

这对预处理器宏不起作用(如评论中所暗示),它们不是 #undef',因此不能准确回答问题。

原回答

不确定实现文件中的链接/全局变量,或者您的文件包含的内容,但对于头文件,您可以将 include 宏放在命名空间中:

namespace a {
#include Python.h
}
namespace b {
#include ruby.h
}

然后您引用正确的命名空间以使用变量:

a::SAME_NAME
b::SAME_NAME

一个演示在 header 中没有收到重新定义投诉的示例。 尽管您可能必须 re-declare 包装器 header.

中需要的每个函数

P.h

#define AAA 2

R.h

#define AAA 1

Pwrapper.h

int get(void);

Pwrapper.cc

#inclide "P.h" //include here, so Pwrapper.h won't conflict definition with R.h
int get(void){
    return AAA;
}

在您实际的操作源文件中

#include "Pwrapper.h"
#include "R.h"