0

Matlab コーダーを使用していくつかの C コードを生成しています。これは最終的に VS 2010 の C# アプリケーションによって消費されます。これを行うには、特定のヘッダー ファイルの一部 (つまり、消費される「インターフェイス」) を手動で変更する必要があります。 :

#ifdef __cplusplus
extern "C" {
#endif
extern real_T add(real_T a, real_T b);
#ifdef __cplusplus
}
#endif
#endif

#ifdef __cplusplus
extern "C" {
#endif
extern __declspec(dllexport) add(real_T a, real_T b);
#ifdef __cplusplus
}
#endif
#endif

C コードを再生成した後、いくつかのヘッダー ファイルに対してこれを行う必要がある場合、これは非常に面倒です。プロセスを自動化する簡単な方法はありますか?

私は C/C++ プログラマーではないことに注意してください。C/C++ コードは、他の要件により「中間メディエーター」として使用されています。フィードバックは大歓迎です。

PS:

私は主に Visual Studio 2010 ソリューション (マクロ?) を探していることに注意してください。これらすべてを実現するために、いつでも小さな C#/Matlab プログラムを作成できますが、それはやり過ぎだと感じています。

4

1 に答える 1

1

regexprepMATLAB では、正規表現による置換 ( )を使用できます。

% This is obtained by textscan() or load() or similar. 
haystack = {
    '#ifdef __cplusplus'
    'extern "C" {'
    '#endif'
    'extern real_T add(real_T a, real_T b);'
    '#ifdef __cplusplus'
    '}'
    '#endif'
    '#endif'
};

% Search query
needle = '^extern\s*real_T\s*add\(real_T\s*a,\s*real_T\s*b\).*$'

% Replacement 
pin = 'extern __declspec(dllexport) real_T add(real_T a, real_T b);';

% Replace all needles with pins
C = regexprep(haystack, needle, pin);

これneedleは、すべてのステートメントの間に任意の数のスペースがある出現も検出します。あなたはそれをに変更することができます

needle = '^extern\s*real_T\s*add\(real_T\s*\w*,\s*real_T\s*\w*\).*$'

また、名前ab各ヘッダーで異なる場合があります。

これはループ内で実行できることに注意してください。ループはdir('*.h')or similar によって取得されたすべてのファイルを対象とし、各反復haystackは or similar によって新しいファイルをロードしますtextscan()。このようなもの:

% all relevant files
files = dir('*.h');

% Loop over all files
for ii = 1:numel(files)

    % Load the file
    fid = fopen(files(ii).name, 'r');
       haystack = textscan(fid, '%s', 'Delimiter', '\n');    
       haystack = haystack{1};
    fclose(fid);

    % do the replacement here
    % ...

end
于 2013-07-02T09:24:35.450 に答える