面向C / C ++开发人员的Eclipse IDE
版本:2018-12(4.10.0) 版本号:20181214-0600
你好, 有没有一种方法可以从源(.c)文件中的函数自动生成标头(.h)(以及使其保持最新状态)?反之亦然可能是发电机吗?
示例:
test.c
void print_val(int val) {
printf("Val: %i", val);
}
int add(int val1, int val2) {
return (val1 + val2);
}
现在我想自动生成头文件
foo.h
/*
* foo.h
*
* Created on: 22.02.2019
*
*/
#ifndef FOO_H_
#define FOO_H_
void print_val(int val);
int add(int val1, int val2);
#endif /* FOO_H_ */
如果我更改了函数声明中的某些内容,头文件也应自动更新(如果需要,最好在复选框中添加要更新的内容)...
答案 0 :(得分:0)
Eclipse具有一个从.c
文件中生成空.h
的函数,该文件称为“实现方法”。相反,在Eclipse中并不存在,这是有充分的理由的。
别误会我的意思。有时您需要更改头文件,但是自动执行此操作不一定是一件好事。至少并非没有某种指令。例如,当您编码尾部递归函数时,通常有一个不应公开的辅助函数。看起来可能像这样:
int sumArrayAux(int * array, size_t size, int currentSum) {
if(size == 0) return 0;
return sumArrayAux(array + 1, size - 1, *array);
}
int sumArray(int * array, size_t size) {
return sumArrayAux(array, size, 0);
}
通常,您不希望公开第一个功能。函数sumArray
是作为接口的。
另一个例子是,如果您的数据结构不是通过api来摆弄的,那么它就不是摆弄。例如,您可能有以下内容:
struct Matrix {
int * values;
size_t cols, rows;
};
和一些功能:
void matrixMultiply(Matrix * A, Matrix * B, Matrix *destination) {
...
}
size_t numberOfColumns(Matrix * m) { return M->cols; }
size_t numberOfRows(Matrix * m) { return M->rows; }
然后,您可能想要一个.h
看起来像这样:
typedef struct Matrix Matrix;
void matrixMultiply(Matrix * A, Matrix * B, Matrix *destination);
size_t numberOfColumns(Matrix * m);
size_t numberOfRows(Matrix * m);
但是在其他情况下,例如,如果不存在numberOfX
函数,则公开Matrix
的整个结构可能更有意义。
重点是应该将头文件用作接口,并且如果没有充分的理由和仔细的考虑,则不应更改接口。在最好的情况下,应该对.c
文件进行任何更改,而不会影响任何包含.h
的文件。
此外,实现几个.c
文件来实现一个.h
并不少见。另外,您可能定义了预处理器宏,这些宏会使这种自动翻译变得复杂。
答案 1 :(得分:0)
看到似乎没有任何功能后,我正在使用正则表达式搜索和替换来快速又肮脏地完成它:
(?m)(?s) \{.*?\R\}\R
;
代替也许会有像宏记录器这样的东西可以通过Eclipse一键完成?
答案 2 :(得分:0)
当必须为不良的旧版代码创建标头时,我在Tick Tac Joe's answer之后添加了以下内容:
如果代码在新行上包含开头的大括号括号,则此正则表达式有效:
(?s)\R\{\R.*?\R\}
regex-replace into:
;
如果您使用的是混合代码,请先使用此模式,以防止Tick Tac Joe的模式(由于if
的括号)导致的错误匹配。
(由于声誉我无法发表评论)