No puede invocar funciones en inicialización estática como esa. En su ejemplo, puede simplemente usar:
struct A a = {42};
Si usted tiene una configuración más complicada, que se necesitan para proporcionar una construcción de biblioteca y la función destrucción biblioteca que obligar a los usuarios de la biblioteca de llamar (asumiendo que usted quiere ser portátil), o tendrá que usar C++ y aprovechar los constructores/destructores, o tendrá que aprovechar el __attribute __ ((constructor) no estándar y no portátil para crear una función que se ejecuta al inicio para inicializarlo
Si usted tiene una configuración más complicada, creo firmemente estaría a favor de que utiliza C++:
class A
{
A(){
// can do initialization in the constructor
}
// ...
};
A a;
Sin embargo, si necesita seguir con C puro, lo portátil que hacer es usar algo como:
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
// ...
Básicamente, en lo anterior, inicializaría su biblioteca con mylibrary_init
y desmontaría su biblioteca utilizando mylibrary_destroy
. Las funciones que utilizan su biblioteca requerirían una instancia inicializada de mylibrary_t
, por lo que la persona que creó la función principal sería responsable de invocar mylibrary_init
. También es bueno hacer que la función de inicialización dependa de un parámetro de "atributos" que se puede reemplazar por 0 o NULL como valor predeterminado. De esta forma, si extiende su biblioteca y necesita aceptar opciones de configuración, estará disponible para usted. Sin embargo, es más un diseño que un enfoque técnico.
Más: No puede llamar a funciones para inicializar estáticamente los datos. Eso es lo que el error de tu compilador intenta decirte. – BjoernD
Está bien, pero ¿qué ocurre si necesito anidar las inicializaciones? Como, digamos que una estructura B tiene una A en ella. ¿Puedo inicializar estáticamente B con un A estático inicializado? es decir struct B b = createB (createA (42)) – Scott
Ah, no importa. Me lo imaginé. Aparentemente puedo hacer: struct B b = {{42}}; ¡Agradable! – Scott