2010-08-23 90 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