Чтобы сделать то, что вы пытаетесь, вам просто нужно немного изменить код, чтобы test.[ch]
не видел переопределение second
.Проблема в том, что символ second
определяется один раз как extern int second;
, а затем снова как символ внутри enum
.Вы не можете видеть оба в одном и том же файле.
Для этого вы можете написать test1.h
, используя второй условный препроцессор, подобный:
#ifndef TEST_H
#define TEST_H
#ifdef USE_ENUM
enum test_enum{
first,
second
};
#else
extern int second;
#endif
#endif
Где в зависимости от того, USE_ENUM
определяется, код будет использовать либо символ, предоставленный enum
, где, если нет, то вам необходимо определить second
в test1.c
#include "test1.h"
#ifdef USE_ENUM
char stub (void) /* stub to prevent empty compilation unit */
{ return 0; }
#else
int second = 2;
#endif
(обратите внимание на использование stub
функции для предотвращения пустой единицы компиляции , если определено USE_ENUM
- иначе в test1.c
не было бы кода)
Теперь все этотребуется включить test1.h
в ваш файл, содержащий main()
и передать компилятору, определив -DUSE_ENUM
как параметр компилятора, в зависимости от того, какой код вы хотите использовать, например,
#include <stdio.h>
#include "test1.h"
int main (void) {
printf ("second: %d\n", second);
}
CompileИспользование int second
, определенное в test.c
Пример:
$ gcc -Wall -Wextra -pedantic -std=c11 -o bin/main1 main1.c test1.c
Пример Использование / Вывод
Когда USE_ENUM
не определено, тогда определение second
, определенное в test1.c
и доступное через extern
, приведет к second
, имеющему значение 2
, например
$ ./bin/main1
second: 2
Компиляция с использованием enum
, определенным в test.h
Пример:
$ gcc -Wall -Wextra -pedantic -std=c11 -o bin/main1 main1.c test1.c -DUSE_ENUM
ПримерИспользование / Вывод
Когда определено USE_ENUM
, значение для символа second
предоставляется enum
в test1.h
, например,
$ ./bin/main1
second: 1
Хотя это незначительный рефакторинг того, что вы пытались сделать, я не вижу другого способа сделать оба без использования условного препроцессора.