首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中包含多语言开发头

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

Stack Overflow用户
提问于 2020-08-07 09:03:47
回答 3查看 222关注 0票数 1

我希望在同一个C/C++文件中包含Python.hruby.h头文件,因为我希望同时使用这两个文件。哪种最好的方法是同时包含这两种语言,并防止编译器/预处理器警告相同变量的多个重定义,还是有另一种方法从C中使用这些语言?

MWE:

代码语言:javascript
复制
// file.cpp

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

int main() {
  return 0;
}

来自预处理器的警告如下所示:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-07 11:03:06

一个示例来演示不会因为headers中的重定义而收到投诉。尽管您可能需要在包装器标头中重新声明所需的每个函数。

P.h

代码语言:javascript
复制
#define AAA 2

R.h

代码语言:javascript
复制
#define AAA 1

Pwrapper.h

代码语言:javascript
复制
int get(void);

Pwrapper.cc

代码语言:javascript
复制
#inclide "P.h" //include here, so Pwrapper.h won't conflict definition with R.h
int get(void){
    return AAA;
}

在用于操作的实际源文件中

代码语言:javascript
复制
#include "Pwrapper.h"
#include "R.h"
票数 0
EN

Stack Overflow用户

发布于 2020-08-07 09:33:00

不知道python.h中是什么,但由于python是一种解释型语言,我假设python.h引用了解释python代码的对象代码,python代码在c++代码中作为文本数据保存,如下所示

代码语言:javascript
复制
char * pythonScript = "print \"Hello, World!\"";
pythonExec(pythonScript);

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

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

值得庆幸的是,像opengl这样的东西本身就是一种语言,并且有一种外语支持的方式,在某种意义上,每个opengl函数和变量都是用c++函数或变量复制的,以至于整个语言都映射到c++中。

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

也许有人有更好的答案。

票数 0
EN

Stack Overflow用户

发布于 2020-08-07 09:48:07

编辑:

对于不是#undef'd的预处理器宏,这不起作用(如注释中所暗示的),因此不能准确地回答问题。

原始答案

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

代码语言:javascript
复制
namespace a {
#include Python.h
}
namespace b {
#include ruby.h
}

然后引用正确的名称空间来使用变量:

代码语言:javascript
复制
a::SAME_NAME
b::SAME_NAME
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63293792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档