Кажется, ваша цель содержит одно определение, на которое ссылаются несколько мест.
Количество возможностей ограничено:
- # определить в .h
- extern, определенный в main или в другом месте за пределами библиотеки.
- extern определено в библиотеке.
- Значение, переданное вызывающей стороной в библиотеку, возможно, вызов инициализации для библиотеки.
- Что-то определенное до #include library.h, которое поднято library.h. Мне не нравится этот
- Как говорит альфа, сделайте это определение во время компиляции.
Пример #define в файле library.h.
// library.h
#ifndef LIBRARY_VALUE
#define LIBRARY_VALUE 1
void somefunction1(void);
#endif
Или, пусть main определяет значение, определенное вызывающей стороной и на которое ссылается библиотека:
// library.h
extern int const library_value; // caller to define in main
void somefunction1(void); // function for caller
// main.c
int const library_value = 5;
int main(void)
{
somefunction1();
return 0;
}
Мне не нравится:
//main.c
#define LIBRARY_VALUE 5
#include "library.h"
//library.h
#ifdef LIBRARY_VALUE
int const library_value = LIBRARY_VALUE; // executable code in .h files is evil
#endif
Некоторым из причин, по которым мне это не нравится, является то, что это неясно и нетрадиционно, если два или более вызывающих библиотеки. H определяют LIBRARY_VALUE, вы будете, или, по крайней мере, должны получать неясные ошибки времени соединения. То же самое применимо, если LIBRARY_VALUE не определен #include ... library.c, сам не может определить значение по умолчанию. Нет, я бы скорее вызвал функцию инициализации для библиотеки, которая принимает константу.