2010-08-23 100 views
8

我有一個很長的常量列表,我需要在多個使用不同語言(Verilog,C,C++和C#)的項目中訪問這些常量。與其用每種語言重複它們,是否有一種很好的方式來分享這些內容?跨語言共享常量

我能想到的唯一的事情是文本文件和預處理腳本? 這是最好的解決方案,還是有更容易/更優雅?

+0

部分受騙者:http://stackoverflow.com/questions/954321/is-it-possible- to-share-an-enum-declaration-between-c-and-unmanaged -c – 2010-08-23 18:09:29

回答

0

你可能會有一個XML文件與常量共享,並在每種語言中解析它。

+1

這會給你運行時值,而不是編譯時常量。 – 2010-08-23 18:05:09

+10

XML就像暴力:如果它不起作用,就用更多。 – 2010-08-23 18:06:39

9

在您的代碼中自動更新這些常量的預處理腳本可能是最好的方法。將代碼與您的項目一起提交以確保正確性,並將其作爲構建腳本的一部分。

+0

這是我以前的工作(混合C,VHDL,彙編器和Matlab)所做的工作。注意,如果你想做比簡單的整型常量更復雜的任何事情(例如,能夠用十六進制指定事物,用其他方法定義的常量),則特殊情況會很快安裝。 – 2010-08-23 20:01:21

+0

M4宏處理器可能是一個不錯的選擇。 – caf 2010-08-24 01:16:11

6

您可以將它們保存在XML文檔中,併爲每種語言編寫XSLT腳本,以在每個構建中生成相應的源文件。

+0

我認爲這是一個非常好的解決方案 - 它也可以處理特殊情況。它是可擴展的。 – JBRWilkinson 2010-08-23 22:16:34

1

你可以使用你的makefile(或等價物)來定義這些常量嗎?對於C和C++。您可以使用編譯器的CLI選項爲常量定義預處理器值。我沒有爲Verilog做過多的構建定製,但我懷疑在那裏也可能存在類似的東西。

1

您可以在

const1 = value1 
const2 = value2 
const3 = value3 

形式寫一個簡單的文件,然後應用類似,爲C:

s/\([a-zA-Z][a-zA-Z1-9_]*\)[ \t]*=[ \t]*\(.*\)/#define \1 \2/

其值得注意的是,您可能需要指定類型,因爲不是所有的語言都可以讓你使用一個不關心類型的prerossessor宏。

或者,您可以使用Flex/Bison中的詞法分析器來解析配置文件。這將變得更加清晰和容易。

0

對於Verilog(至少對於系統的Verilog)和C++可以都常數描述爲一個列表(假設全部都是相同類型的),如下所示:

a=0, b= 1, c = 2, ..; 

在C + +你會使用

const int 
#include <myconsts> 

的Verilog(至少在系統的Verilog),你可以使用這個

parameter int 
`include "myconsts" 

我猜c#沒有包含。所以,你至少需要一個pre-pcocessing腳本來將你的常量包含在一個類中。你可能可以使用'cpp'。對不起,對c#不太瞭解。

其實,讓所有類似我可能會使用cpp生成我需要的文件:的

#ifdef CPP 
    const int 
#elsif VERILOG 
    parameter int 
#elsif CSHARP 
    class Constants { 
     const int 
#endif 

    a = 0, 
    c = 1, 
    d = 2; 

#ifdef(CSHARP) 
    }; 
#endif