簡體   English   中英

如何使C枚舉類型可用於其他語言?

[英]How to make C enum types available to other languages?

我目前正在編寫一個C / C ++程序,該程序使用頭文件中的一堆enum ,比如

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

我的程序與其他各種語言(F77,F90,Python等)接口,我希望在C / C ++頭文件中一次性定義這些枚舉類型,並在其他語言中也使用它們。 我想避免為我要與之交互的每種語言定義相同的“ enum ”類型(在其他語言中,它們的名稱可能不同……),因為這將是一個容易出錯的任務。 有一些優雅的方法嗎?

假設在所有語言中都將它們定義為逗號分隔的列表,則可以執行以下操作:

ENUMS.txt

 POINT,
 LINE,
 AREA,
 VOLUME

Myfile.h

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

在C / C ++中,它將起作用。 但是我不知道您的其他語言是否具有類似的功能,例如C / C ++中的include。 如果是,則可以通過這種方式進行。

我非常確定,例如,這在Java中將不起作用。

否則,您只能在一些配置文件中定義它們並通過函數將它們映射,但是它們將不再是枚舉。 如果僅此示例,則可能不值得付出任何努力,但是,如果您有數百個這樣的名稱,則可能值得。

UPDATE

在考慮了這一點之后,可能還有其他方法,雖然需要一些工作,但可能很有用。 對於支持如我上面顯示的include的語言,此方法很好。 對於其他語言,例如Java,Python等,您可以編寫一個簡單的腳本來生成有效的源文件。 我在做類似的事情,使java根據從數據庫中讀取的定義將數據庫記錄生成為類。 如果您必須支持多種語言,並且/或者經常修改枚舉,那么這可能很有用,因為您仍然需要維護一個來源。

采用Python的Devolus方法,您可以像這樣為枚舉文字創建字典:

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”訪問您的枚舉。

那是一種方式。 我敢肯定,自從這是Python之后,還有一百萬...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM