Eclipse CDT:如何从源文件生成头文件?

时间:2019-02-22 12:53:07

标签: c eclipse eclipse-cdt

面向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_ */

如果我更改了函数声明中的某些内容,头文件也应自动更新(如果需要,最好在复选框中添加要更新的内容)...

3 个答案:

答案 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)

看到似乎没有任何功能后,我正在使用正则表达式搜索和替换来快速又肮脏地完成它:

  1. 关闭所有其他标签
  2. STRG + H
  3. 选择文件选项卡
  4. 在搜索字段中,正则表达式为(?m)(?s) \{.*?\R\}\R
  5. 单击“活动编辑器中的资源”
  6. 点击替换
  7. 用分号;代替
  8. 使用预览查看更改(以防万一)

也许会有像宏记录器这样的东西可以通过Eclipse一键完成?

答案 2 :(得分:0)

当必须为不良的旧版代码创建标头时,我在Tick Tac Joe's answer之后添加了以下内容:

如果代码在新行上包含开头的大括号括号,则此正则表达式有效:

(?s)\R\{\R.*?\R\}
regex-replace into:
;

如果您使用的是混合代码,请先使用此模式,以防止Tick Tac Joe的模式(由于if的括号)导致的错误匹配。

(由于声誉我无法发表评论)