Работа со статическими функциями при сборке программы в виде библиотеки - PullRequest
0 голосов
/ 16 декабря 2018

Чтобы реализовать модульное тестирование для одной из моих программ, я добавил правило make-файла для сборки программы в виде статической библиотеки при запуске «make check».Я обертываю main () с # ifndef TEST_LIB и # endif ( TEST_LIB определяется при сборке в виде библиотеки).

Затем ясоздал несколько небольших C-файлов для тестирования некоторых функций из этой библиотеки.

Некоторые функции из библиотеки объявлены статически.

Что вы можете догадаться, выдает такие предупреждения, когда я пытаюсь скомпилироватьтесты:

/ .. / test / config_test.c: 15: 3: предупреждение: неявное объявление функции 'реализовать_дом' [-Ядное-объявление-функции]

Поскольку реализовать_дом объявлено статически в исходном коде (файл .c) для программы.

Я попытался решить одну проблему: #include config_rmw.c (который содержит статические функции) в файл модуля .c (config_test).Это на самом деле работает и не дает мне никаких предупреждений при компиляции, хотя config_rmw.c уже встроен в библиотеку.

Другое решение, о котором я подумал, было что-то вроде

#ifndef TEST_LIB
static
#endif
void function()
{
    definition
}

И добавление прототипа к заголовку, что является выражением #ifdef.

#ifdef TEST_LIB
function prototype
#endif

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

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

В файле, включенном из ../../src/rmw.c:38:0: ../../src/config_rmw.h:86: 1: предупреждение: «реализовать_дом» определено, но не используется [-Wunused-функция] реализовать_доме (char ** str) ^ ~~~~~~~~~~~

Я немного прочели я вроде понимаю, почему это происходит.И в основном это означает, что я получу отдельную копию этой функции в каждом файле .c, который включает в себя заголовочный файл, в котором она определена.Который мне не нужен.Причина, по которой я объявляю некоторые функции статически, заключается в том, что они нужны только в одном файле.

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

Итак... Я застрял с вопросом о лучшем подходе и других вариантах.Я предпочитаю держать свои программы организованными и применять хорошие навыки кодирования.

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

ОБНОВЛЕНИЕ (Дополнение) Программа имеет 20 исходных файлов (включая заголовки) и ~ 4K строк кода.

1 Ответ

0 голосов
/ 18 декабря 2018

Я сделаю то, что было предложено здесь

Я думаю, что # включая файл .c подойдет для тестов.Если по какой-либо причине это когда-либо вызывает проблемы, подход «обертки», предложенный pan64, должен быть приемлемым компромиссом.

static void realize_home(char **)
{
    implementation
}
#ifdef UNITTEST
void test_realize_home(char **v)
{
    realize_home(v);
}
#endif
...