如何在 C++ 中包含多语言开发 header
How to include multiple language development header in C++
我想将 Python.h
和 ruby.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"
我想将 Python.h
和 ruby.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"