我有一长串常量,我需要在几个不同语言(Verilog、C、C++ 和 C#)的项目中访问这些常量。与其用每种语言重复它们,有没有好的方法来分享它们?
我唯一能想到的是一个文本文件和一个预处理脚本?这是最好的解决方案还是有更简单/更优雅的东西?
自动更新代码中这些常量的预处理脚本可能是最好的方法。将代码与您的项目一起提交以确保正确性并将其作为构建脚本的一部分。
您可以将它们保存在 XML 文档中,并为每种语言编写 XSLT 脚本,以便在每个构建中生成适当的源文件。
您可以编写一个简单的文件形式为
const1 = value1
const2 = value2
const3 = value3
然后为 c 应用类似的东西:
s/\([a-zA-Z][a-zA-Z1-9_]*\)[ \t]*=[ \t]*\(.*\)/#define \1 \2/
值得注意的是,您可能需要指定类型,因为并非所有语言都允许您使用不关心类型的预处理器宏。
或者,您可以在 Flex/Bison 中制作词法分析器/解析器来解析配置文件。这将更清晰,更容易扩展。
您可以使用您的 makefile(或等效文件)来定义这些常量吗?对于 C 和 C++。您可以使用编译器的 CLI 选项来定义常量的预处理器值。我没有为 Verilog 做太多的构建定制,但我怀疑那里也可能存在类似的东西。
您可能有一个XML
包含要共享的常量的文件,并以每种语言对其进行解析。
对于verilog(至少对于系统verilog)和c ++,您可以将所有常量描述为一个列表(假设它们都属于同一类型),如下所示:
a=0, b= 1, c = 2, ..;
在 C++ 中你会使用
const int
#include <myconsts>
在verilog中(至少在系统verilog中)你可以使用这个
parameter int
`include "myconsts"
我猜c#没有包含。因此,您至少需要一个预处理脚本来将您的常量包含在一个类中。您也许可以为此使用“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