【问题标题】:Sharing constants across languages跨语言共享常量
【发布时间】:2010-08-23 18:01:46
【问题描述】:

我有一长串常量,我需要在几个项目中访问这些常量,这些项目使用不同的语言(Verilog、C、C++ 和 C#)。与其用每种语言重复它们,有没有好的方法来分享它们?

我唯一能想到的是一个文本文件和一个预处理脚本? 这是最好的解决方案还是有更简单/更优雅的方法?

【问题讨论】:

标签: c# c++ c constants verilog


【解决方案1】:

自动更新代码中这些常量的预处理脚本可能是最好的方法。将代码与您的项目一起提交以确保正确性并将其作为构建脚本的一部分。

【讨论】:

  • 这是我们以前的工作(混合 C、VHDL、汇编程序和 Matlab)。请注意,如果您想做比简单整数常量更复杂的事情(例如,能够以十六进制指定事物,以其他方式定义的常量),则特殊情况会迅速增加。
【解决方案2】:

您可以将它们保存在 XML 文档中,并为每种语言编写 XSLT 脚本,以便在每个构建中生成适当的源文件。

【讨论】:

  • 我认为这是一个极好的解决方案 - 它也允许处理特殊情况。而且它是可扩展的。
【解决方案3】:

您可以使用您的 makefile(或等效文件)来定义这些常量吗?对于 C 和 C++。您可以使用编译器的 CLI 选项来定义常量的预处理器值。我没有为 Verilog 做太多的构建定制,但我怀疑那里也可能存在类似的东西。

【讨论】:

    【解决方案4】:

    你可以写一个简单的文件,格式为

    const1 = value1
    const2 = value2
    const3 = value3
    

    然后应用类似的东西,对于 c:

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

    值得注意的是,您可能需要指定类型,因为并非所有语言都允许您使用不关心类型的预处理器宏。

    或者,您可以在 Flex/Bison 中制作词法分析器/解析器来解析配置文件。这样会更清晰,更容易扩展。

    【讨论】:

      【解决方案5】:

      您可能有一个 XML 文件,其中包含要共享的常量,并以每种语言对其进行解析。

      【讨论】:

      • 这将为您提供运行时值,而不是编译时常量。
      【解决方案6】:

      对于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
      

      【讨论】:

        猜你喜欢
        • 2020-02-26
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多