.net 自动化头文件操作C/C++-&燃气轮机;C#
我正在使用Matlab编码器生成一些C代码,最终被VS2010中的一个C#应用程序使用。要做到这一点,我必须手动更改某些头文件的某些部分(即正在使用的“接口”): 到 如果我必须在重新生成C代码后对几个头文件执行此操作,那么这可能会非常乏味。有没有一种简单的方法来自动化这个过程 请注意,我不是C/C++程序员。由于其他一些要求,C/C++代码只是用作“中间人”。欢迎任何反馈 附言:.net 自动化头文件操作C/C++-&燃气轮机;C#,.net,visual-studio-2010,matlab,visual-c++,pinvoke,.net,Visual Studio 2010,Matlab,Visual C++,Pinvoke,我正在使用Matlab编码器生成一些C代码,最终被VS2010中的一个C#应用程序使用。要做到这一点,我必须手动更改某些头文件的某些部分(即正在使用的“接口”): 到 如果我必须在重新生成C代码后对几个头文件执行此操作,那么这可能会非常乏味。有没有一种简单的方法来自动化这个过程 请注意,我不是C/C++程序员。由于其他一些要求,C/C++代码只是用作“中间人”。欢迎任何反馈 附言: 请注意,我主要寻找visual studio 2010解决方案(宏?)。我总是可以编写一个小小的C#/Matlab
请注意,我主要寻找visual studio 2010解决方案(宏?)。我总是可以编写一个小小的C#/Matlab程序来实现这一切,但我觉得这太过分了。在Matlab中,可以使用正则表达式替换(
regexprep
):
这个特殊的指针
还查找在所有语句之间具有任意数量空格的事件。你可以把它改成
needle = '^extern\s*real_T\s*add\(real_T\s*\w*,\s*real_T\s*\w*\).*$'
如果名称a
和b
在每个标题中也可能不同
请注意,这可以在循环内完成,循环覆盖通过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
谢谢你冗长的回答。我更想找一个VisualStudio的“解决方案”(宏?)。对不起,我应该说得更清楚一些……我想你和OP都忘记了函数的返回类型。我对你坚持使用MATLAB的解决方案表示赞赏,但我会在shell中完成它(sed或awk)@Amro:me也是,但由于OP显然了解MATLAB,并将其标记为“Visual Studio 2010”,我假设没有POSIX shell可用:)@csetzkorn:Visual Studio难道没有“替换所有打开文件中的文本”的选项吗?如果是这样,只需在VS2010中打开所有相关的标题,并用替换项替换所有出现的内容……如果不是在VS2010中,我相信记事本++还有其他一些编辑器可以选择。我敢肯定,在VS2010项目中,有可能用它来制作一种单击式解决方案,但由于这感觉像是一种修复/解决方法,我只想简单的脚本和/或“智能”手动替换。谢谢。是的,这是可能的,但你仍然必须打开它们。每天可能要做几次,这可能会很累。刚刚查看了VS宏-似乎是不可能的。毕竟可能不得不使用纸条/程序。。。感谢您的帮助。VS的“查找/替换”对话框支持正则表达式,不是吗?难道没有办法自定义MATLAB编码器(可能使用嵌入式编码器),以便它生成您想要的标题吗?手动修改自动生成的代码不是一个好做法。那太好了-请在明信片上回答。似乎不可能通过宏更改源文件的内容。
% 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 = '^extern\s*real_T\s*add\(real_T\s*\w*,\s*real_T\s*\w*\).*$'
% 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