Как сделать типы перечисления C доступными для других языков?

В настоящее время я пишу программу на C / C ++, которая использует кучу enumскажем, из заголовочного файла

typedef enum
{
POINT,
LINE,
AREA,
VOLUME
} domainType;

Моя программа взаимодействует с различными другими языками (F77, F90, Python, …), и я хочу, чтобы эти типы перечислений были когда-то определены в заголовочном файле C / C ++, и использовать их также на других языках. Я хотел бы избежать определения того же «enum«типы (они могут называться по-разному в других языках …) для каждого отдельного языка, с которым я взаимодействую, потому что это было бы очень подверженным ошибкам заданием. Есть ли какой-нибудь элегантный способ, как это сделать?

2

Решение

Предполагая, что на всех языках вы определяете их как список через запятую, вы можете сделать что-то вроде этого:

ENUMS.txt

 POINT,
LINE,
AREA,
VOLUME

Myfile.h

typedef enum
{
#include "ENUMS.txt"} domainType;

В C / C ++ это будет работать. Однако я не знаю, есть ли в других языках похожая функция, например, в C / C ++. Если да, то вы можете сделать это таким образом.

Я уверен, что это не будет работать в Java, например.

В противном случае вы можете определить их только в некотором конфигурационном файле и отобразить их с помощью функций, но тогда они больше не будут перечисляться. Если этот пример — все, что у вас есть, то это вероятно не стоит усилий, но если у вас есть сотни таких имен, то это может стоить.

ОБНОВИТЬ

Подумав об этом, возможно, есть какой-то другой подход, который будет немного трудоемким, но может оказаться полезным. Для языков, которые поддерживают включение, как я показал выше, этот подход хорош. Для других языков, таких как Java, Python и т. Д., Вы можете написать простой скрипт, который генерирует допустимый исходный файл. Я делал нечто подобное для java, чтобы генерировать записи базы данных как классы, основываясь на определении, считанном из базы данных.
Если вам нужно поддерживать много языков и / или часто изменять перечисления, это может быть полезно, так как у вас все еще есть один источник для обслуживания.

2

Другие решения

Используя подход Devolus для Python, вы можете создать словарь для литералов перечисления, например:

with open('ENUMS.txt', 'r') as f:
content = f.read().splitlines()

domainType = {}
index = 1
for enum_literal in content:
enum_literal = enum_literal.strip() # remove any whitespace
enum_literal = enum_literal.rstrip(',') # remove comma
print 'Adding ' + enum_literal + ' to dict'
domainType [enum_literal] = index
index = index + 1

Затем вы можете использовать «domainType» для доступа к вашим перечислениям.

Это был бы один из способов. Я уверен, что есть еще миллион, так как этот Питон …

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector