Вы не можете вызывать функции при статической инициализации подобным образом. В вашем примере вы можете просто использовать:
struct A a = {42};
Если у вас более сложная установка, вам потребуется обеспечить функцию создания библиотеки и уничтожения библиотеки, которую вы заставляете вызывать пользователи вашей библиотеки (при условии, что вы хотите быть переносимой), или вам придется использовать C ++ и взять преимущество конструкторов / деструкторов, или вам придется воспользоваться нестандартным и непереносимым __attribute __ ((constructor)), чтобы создать функцию, запускаемую при запуске, для ее инициализации.
Если у вас более сложные настройки, я настоятельно рекомендую вам использовать C ++:
class A
{
A(){
// can do initialization in the constructor
}
// ...
};
A a;
Однако, если вам нужно придерживаться чистого C, переносимая вещь, которую нужно сделать, это использовать что-то вроде:
typedef void* mylibrary_attr_t;
typedef void* mylibrary_t;
#ifdef __cplusplus
# define EXTERNC extern "C"
#else
# define EXTERNC
#endif
EXTERNC int mylibrary_attr_init(mylibrary_attr_t*);
EXTERNC int mylibrary_attr_setparam1(mylibrary_attr_t,int);
EXTERNC int mylibrary_attr_setparam2(mylibrary_attr_t,double);
// .. more functions for various attributes used by library
EXTERNC void mylibrary_attr_destroy(mylibrary_attr_t*);
EXTERNC int mylibrary_init(mylibrary_t*,mylibrary_attr_t);
EXTERNC void mylibrary_destroy(mylibrary_t*);
// functions that use mylibrary_t
// ...
По сути, в приведенном выше примере вы бы инициализировали вашу библиотеку с помощью mylibrary_init
и разобрали бы вашу библиотеку с помощью mylibrary_destroy
. Для функций, использующих вашу библиотеку, потребуется инициализированный экземпляр mylibrary_t
, и поэтому лицо, создавшее основную функцию, будет отвечать за вызов mylibrary_init
. Также полезно сделать функцию инициализации зависимой от параметра «атрибутов», который может быть заменен на 0 или NULL по умолчанию. Таким образом, если вы расширяете свою библиотеку и вам необходимо принять параметры конфигурации, она доступна вам. Это скорее дизайн, чем технический подход.