【问题标题】:automating header file manipulation C/C++ -> C#自动化头文件操作 C/C++ -> C#
【发布时间】:2013-07-02 08:52:51
【问题描述】:

我正在使用 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 程序来实现这一切,但我觉得这太过分了。

【问题讨论】:

  • VS的查找/替换对话框支持正则表达式,不是吗?
  • 难道没有办法自定义 MATLAB Coder(可能使用 Embedded Coder)以生成您想要的标头吗?手动修改自动生成的代码不是好习惯。
  • 那太好了 - 请在明信片上回答
  • 似乎无法通过宏来更改源文件的内容。

标签: .net visual-studio-2010 matlab visual-c++ pinvoke


【解决方案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*\).*$'

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

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

% 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

【讨论】:

  • 感谢您的冗长回答。我更多的是在寻找 Visual Studio 的“解决方案”(宏?)。抱歉,我应该更清楚地说明这一点...
  • 我认为您和 OP 都忘记了函数返回类型。我赞赏你坚持使用 MATLAB 的解决方案,但我会在 shell 中完成它(sed 或 awk)
  • @Amro:我也是,但由于 OP 显然知道 MATLAB,并用“Visual Studio 2010”标记了它,我认为没有可用的 POSIX shell :)
  • @csetzkorn:Visual Studio 没有“替换所有打开文件中的文本”选项吗?如果是这样,只需在 VS2010 中打开所有相关标题并用替换替换所有出现的标题...如果不是在 VS2010 中,Notepad++ 有我相信的选项,以及一堆其他编辑器。我确信可以在您的 VS2010 项目中创建一种单击式解决方案,但由于这感觉像是一种修复/解决方法,我不会比简单的脚本和/或“智能”手册更进一步替换。
  • 谢谢。是的,这是可能的,但你仍然必须打开它们。每天可能要这样做几次,这可能会很累。刚刚查看了 VS 宏 - 似乎不行。毕竟可能不得不使用脚本/程序......感谢您的所有帮助。
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多