我希望在同一个C/C++文件中包含Python.h和ruby.h头文件,因为我希望同时使用这两个文件。哪种最好的方法是同时包含这两种语言,并防止编译器/预处理器警告相同变量的多个重定义,还是有另一种方法从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发布于 2020-08-07 11:03:06
一个示例来演示不会因为headers中的重定义而收到投诉。尽管您可能需要在包装器标头中重新声明所需的每个函数。
P.h
#define AAA 2R.h
#define AAA 1Pwrapper.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"发布于 2020-08-07 09:33:00
不知道python.h中是什么,但由于python是一种解释型语言,我假设python.h引用了解释python代码的对象代码,python代码在c++代码中作为文本数据保存,如下所示
char * pythonScript = "print \"Hello, World!\"";
pythonExec(pythonScript);Python是一种解释型语言(至少在linux上是这样),也是c++编译器的一门外语。
我见过的唯一一次c++直接支持一门外语是依赖于实现的asm关键字,在这个关键字中,一些编译器允许您将汇编语言代码块直接写入C++源代码。并不是所有的编译器都支持它,asm是我唯一一次看到这种风格的支持。
值得庆幸的是,像opengl这样的东西本身就是一种语言,并且有一种外语支持的方式,在某种意义上,每个opengl函数和变量都是用c++函数或变量复制的,以至于整个语言都映射到c++中。
很抱歉,我没有一个完整的答案,但考虑到我认为你正在尝试做的事情并没有得到真正的支持,我希望它能为你提供一些指导,告诉你应该在哪里寻找。
也许有人有更好的答案。
发布于 2020-08-07 09:48:07
编辑:
对于不是#undef'd的预处理器宏,这不起作用(如注释中所暗示的),因此不能准确地回答问题。
原始答案
不确定实现文件中的链接/全局变量,也不确定文件包含的内容,但对于头文件,可以将include宏放在名称空间中:
namespace a {
#include Python.h
}
namespace b {
#include ruby.h
}然后引用正确的名称空间来使用变量:
a::SAME_NAME
b::SAME_NAMEhttps://stackoverflow.com/questions/63293792
复制相似问题