Eclipse CDT: Как создать заголовочный файл из исходного файла? - PullRequest
0 голосов
/ 22 февраля 2019

Eclipse IDE для разработчиков на C / C ++

Версия: 2018-12 (4.10.0) Идентификатор сборки: 20181214-0600


Здравствуйте, есть ли способ автоматической генерациизаголовок (.h) из функций в исходном (.c) файле (плюс его обновление)?Может быть, даже генератор наоборот?

Пример:

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

Кроме того, файл заголовка должен автоматически обновляться, если я что-то изменяю в объявлении функции (если я хочу, лучше всего с флажками, что обновлять) ...

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Увидев, что, похоже, нет никакой функциональности, я делаю это быстро и грязно с помощью поиска по регулярному выражению и заменим:

  1. Закройте все остальные вкладки
  2. STRG + H
  3. Выберите вкладку Файл
  4. В поле поиска регулярное выражение: (?m)(?s) \{.*?\R\}\R
  5. Нажмите «Ресурс в активном редакторе»
  6. Нажмите Заменить
  7. Замените его точкой с запятой ;
  8. Используйте предварительный просмотр, чтобы посмотреть на изменения (на всякий случай)

Может быть, есть что-то вроде устройства записи макросов для Eclipse изсделать это одним кликом ??

0 голосов
/ 22 февраля 2019

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.Кроме того, вы можете определить макросы препроцессора, которые усложнят такой автоматический перевод.

...