Как условно компилировать main() в C?
Я работаю над небольшим проектом с открытым исходным кодом в C, где я пытаюсь использовать тестовый фреймворк с C (фреймворк min_unit
).
у меня есть foo.h
файл с прототипами, и foo.c
, с реализацией.
В моем тестовом файле tests.c
, Я имею
#include "../test_framework/min_unit.h"
#include "foo.c"
... test cases ...
проблема в том, что у меня есть main()
функция в foo.c
(что мне нужно скомпилировать), я не могу скомпилировать tests.c
потому что я получаю сообщение об ошибке
note: previous definition of ‘main’ was here
int main() {
У меня вопрос, есть ли способ сделать так, чтобы main()
функция в foo.c
является условным, так что он не компилируется, когда я бегу tests.c
? Просто раздражает, что приходится снова и снова удалять и добавлять основные.
2 ответа
Самый простой способ использовать условную компиляцию - это использовать #ifdef
заявления. Например, в foo.c
у тебя есть:
#ifdef NOT_TESTING //if a macro NOT_TESTING was defined
int main() {
//main function here
}
#endif
Пока в test.c
Вы положили:
#ifndef NOT_TESTING //if NOT_TESTING was NOT defined
int main() {
//main function here
}
#endif
Когда вы хотите скомпилировать main
функция в foo.c
Вы просто добавляете опцию -DNOT_TESTING
к вашей команде компиляции. Если вы хотите скомпилировать main
функция в test.c
, не добавляйте эту опцию.
Разве вы не пробовали использовать условия компилятора препроцессора? Может быть, вы пытались, но это не работает, гул?
В любом случае, вы, вероятно, должны:
1- Определите токен в начале файла класса "tests.c", например:
#defined foo_MIN_UNIT_TEST
2- Окружите ваш метод "main() { ... } " в файле класса "foo.c" с помощью #ifndef / #endif, например:
#ifndef foo_MIN_UNIT_TEST //consider using #ifndef not #ifdef!!!
int main()
{ ... }
#endif
3- Таким образом, когда вы компилируете свои файлы модульных тестов, метод main () файла foo.c не будет включен во время компиляции, и единственный метод main () тестов будет доступен для компилятора.
Для дальнейшего чтения: http://www.cprogramming.com/
С уважением.