Как включить заголовок многоязычной разработки в C ++ - PullRequest
1 голос
/ 07 августа 2020

Я хочу включить заголовки Python.h и ruby.h в один и тот же файл C / C ++, так как я хочу работать с обоими одновременно. Что было бы лучшим способом включить оба и предотвратить предупреждение компилятора / препроцессора о многократных переопределениях одних и тех же переменных, или есть другой способ использовать эти языки из C?

MWE:

// file.cpp

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

int main() {
  return 0;
}

I такие предупреждения от препроцессора:

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

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

Изменить:

Это не работает (как указано в комментарии) для макросов препроцессора, которые не являются #undef d, поэтому не дает точного ответа на вопрос.

Оригинал ответ

Не уверен в связывании / глобальных переменных в файлах реализации или в том, что содержат ваши файлы, но для файлов заголовков вы можете поместить макрос include в пространство имен:

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

Затем вы ссылаетесь на правильное пространство имен для использования переменной:

a::SAME_NAME
b::SAME_NAME
0 голосов
/ 07 августа 2020

Пример, демонстрирующий отсутствие жалобы на переопределение в заголовках. Хотя вам, возможно, придется повторно объявить все необходимые функции в заголовке оболочки.

Ph

#define AAA 2

Rh

#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"
0 голосов
/ 07 августа 2020

Не уверен, что находится в python .h, но поскольку python является интерпретируемым языком, я предполагаю, что python .h ссылается на объектный код, который интерпретирует код python, который хранится как текстовые данные в вашем коде C ++ как in

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

Python - это интерпретируемый язык (по крайней мере, на linux), а также иностранный язык для компилятора c ++.

Единственный раз, когда я видел, что c ++ напрямую поддерживает иностранный язык - это ключевое слово asm, зависящее от реализации, где некоторые компиляторы позволяют записывать блоки кода на языке ассемблера непосредственно в исходный код C ++. Его поддерживают не все компиляторы и асмовый единственный раз, когда Я видел этот стиль поддержки.

1007 * Debateably, такие вещи, как OpenGL языки в их собственном праве и есть способ поддержки иностранного языка в том смысле, что каждый Функция и переменная opengl реплицируются с функцией или переменной c ++ в той степени, в которой весь язык отображается в c ++.

Извините, у меня нет полного ответа, но, учитывая, что я думаю, что то, что вы пытаетесь сделать, на самом деле не поддерживается , Я надеюсь, он даст вам некоторые подсказки, где вы должны искать.

Может быть, у кого-нибудь есть лучший ответ.

...