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

在 MATLAB 中,您可以使用正则表达式替换 ( regexprep):

% 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*\).*$'

如果每个标题中的名称a和名称b也可以不同。

请注意,这可以在循环内完成,其中循环遍历通过或类似获得的所有文件,并且每次迭代都通过dir('*.h')或类似加载一个新文件。像这样的东西:haystacktextscan()

% 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 回答