Как условно компилировать 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/

С уважением.

Другие вопросы по тегам