Написание макроса, при котором статика отключена при тестировании
У меня проблемы с написанием этого макроса. Пользуюсь семенником.
У меня есть файл globals.h со следующим кодом:
#ifndef globals
#ifndef UNITY
#define STATIC static
#else
#define STATIC
#endif
#define globals 1
#endif
Итак, здесь должно произойти следующее: любой метод, использующий STATIC, будет статическим, если код не тестируется с единицей, иначе он не будет статическим.
Мой тестовый файл включает "unity.h", затем включает "globals.h", а затем включает "protocol.h".
Тестируемый файл "protocol.c" включает "globals.h", а затем "protocol.h".
Тестовый файл "test_protocol.c" включает "unity.h", затем "globals.h", затем "protocol.h".
Насколько я понимаю, сначала следует определить UNITY, затем он перейдет в globals.h
, и определите STATIC как ничто, поскольку UNITY уже определено в UNITY.h
Однако поведение, которое я наблюдаю, таково: что бы я ни делал, я не могу globals.h
войти в это #else
директива, и поэтому кажется невозможным STATIC
быть определенным как что-либо кроме static
.
Однако я знаю, что то, что я пытаюсь достичь, возможно, потому что многие люди рекомендуют эту стратегию и реализовали ее. Итак, что я делаю, что вызываетglobals.h
думать, что ЕДИНСТВО не определено, когда это так?
1 ответ
Я знаю, что это не прямой ответ на ваш вопрос, но вместо проверки с #ifndef UNITY
, вы можете передать флаг препроцессора при компиляции кода.
например
g++ protocol.c -DBUILD_TYPE="not_test"
g++ test_protocol.c -DBUILD_TYPE="test"
а затем зарегистрируйтесь global.h
код как
#define TEST test
#define NOT_TEST not_test
#ifndef globals
#if BUILD_TYPE == NOT_TEST
#define STATIC static
#else
#define STATIC
#endif
#define globals 1
#endif
test_protocol.c
не нужно включать
globals.h
файл. С точки зрения
test_protocol.c
это все в
protocol.c
имеет внешнюю связь, но сама в этом не нуждается.
Потому как
protocol.c
и
test_protocol.c
находятся в разных единицах перевода,
UNITY
определено в
UNITY.h
не видно в
protocol.c
потому что он не включает
UNITY.h
.
Конечно, тестируемый код должен быть сохранен. Итак, мы должны как-то сказать
protocol.c
около
UNITY
флаг во время теста, но не при нормальной компиляции. Вот где раздел
:defines:
в файле yaml светится.
В
project.yml
файл уже определил
TEST
макрос:
:defines:
# in order to add common defines:
# 1) remove the trailing [] from the :common: section
# 2) add entries to the :common: section (e.g. :test: has TEST defined)
:common: &common_defines []
:test:
- *common_defines
- TEST # <--- here
:test_preprocess:
- *common_defines
- TEST # <--- and here
Вам нужно определить
UNITY
здесь тоже или просто используйте
TEST
макрос в вашем
globals.h
. В
TEST
в любом случае макросы существуют для этой цели.
Это гарантирует, что флаг
TEST
передается каждой единице перевода, если она скомпилирована
ceedling
для тестирования, но не там, если вы используете обычный компилятор, как обычно.