Совместное использование констант по языкам - PullRequest
8 голосов
/ 23 августа 2010

У меня есть длинный список констант, к которым мне нужен доступ в нескольких проектах на разных языках (Verilog, C, C ++ и C #). Вместо того, чтобы повторять их на каждом языке, есть ли хороший способ поделиться ими?

Единственное, о чем я мог подумать, это текстовый файл и скрипт предварительной обработки? Это лучшее решение или есть что-то более простое / элегантное?

Ответы [ 6 ]

9 голосов
/ 23 августа 2010

Сценарий предварительной обработки, который автоматически обновляет эти константы в вашем коде, вероятно, является лучшим методом. Передайте код вместе с вашим проектом, чтобы убедиться в его корректности и включить его в сценарий сборки.

6 голосов
/ 23 августа 2010

Вы можете хранить их в документе XML и писать сценарии XSLT для каждого языка, чтобы генерировать соответствующие исходные файлы в каждой сборке.

1 голос
/ 23 августа 2010

Вы можете написать простой файл в виде

const1 = value1
const2 = value2
const3 = value3

, а затем применить что-то вроде, для c:

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

Стоит отметить, что вам может потребоваться указать типы, поскольку не все языки позволяют использовать макрос препроцессора, который не заботится о типе.

Кроме того, вы можете создать лексер / парсер в Flex / Bison для разбора файла конфигурации. Это будет понятнее и проще для расширения.

1 голос
/ 23 августа 2010

Можете ли вы использовать ваш make-файл (или его эквивалент) для определения этих констант?Для C и C ++.Вы можете использовать опции CLI компилятора, чтобы определить значения препроцессора для констант.Я не выполнил много настроек для Verilog, но подозреваю, что и там может существовать нечто подобное.

0 голосов
/ 18 июня 2017

Для 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
0 голосов
/ 23 августа 2010

Возможно, у вас есть файл XML с константами для совместного использования, и он может быть проанализирован на каждом языке.

...