2010-08-23 2 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 –

ответ

0

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

+1

Это даст вам значения времени выполнения, а не константы времени компиляции. –

+10

XML - это как насилие: если он не работает, используйте больше. –

9

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

+0

Это то, что мы делали в моей предыдущей работе (микширование C, VHDL, ассемблер и Matlab). Обратите внимание, что специальные случаи быстро обновляются, если вы хотите сделать что-либо более сложное, чем простые целочисленные константы (например, возможность указывать вещи в шестнадцатеричном виде, константы, определенные в терминах других). –

+0

Макро-процессор M4 вполне может быть хорошим выбором. – caf

6

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

+0

Я думаю, что это превосходное решение - это также позволит заниматься специальными делами. И это расширяемо. – JBRWilkinson

1

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

1

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

const1 = value1 
const2 = value2 
const3 = value3 

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

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

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

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

0

Для 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 
Смежные вопросы