¿Cómo inicializar una estructura usando el estilo c al usar el comstackdor g ++?

Generalmente, para inicializar una struct en c, solo podríamos especificar parte de los campos. Como abajo:

 static struct fuse_operations hello_oper = { .getattr = hello_getattr, .readdir = hello_readdir, .open = hello_open, .read = hello_read, }; 

Sin embargo, en C ++, debemos inicializar las variables en la struct sin nombrar los campos. Ahora, ¿qué pasa si me gustaría inicializar una struct usando el estilo c mientras uso el comstackdor g ++, cómo lograr esto? PD: la razón por la que necesito hacer esto es que la struct fuse_operations tiene demasiados campos en ella.

Desafortunadamente, incluso la versión C ++ 11 del estándar C ++ carece de la característica de inicializadores designada de C99.

Tu escribiste:

  static struct fuse_operations hello_oper = { .getattr = hello_getattr, .readdir = hello_readdir, .open = hello_open, .read = hello_read, }; 

Generalmente, para inicializar una estructura en c, solo podríamos especificar parte de los campos […] Sin embargo, en C ++, debemos inicializar las variables en la estructura sin nombrar los campos. Ahora, ¿qué pasa si me gustaría inicializar una estructura usando el estilo c mientras uso el comstackdor g ++, cómo lograr esto? PD: la razón por la que necesito hacer esto es que la estructura fuse_operations tiene demasiados campos en ella.

Mi solución fue especializar la estructura con un constructor:

 struct hello_fuse_operations:fuse_operations { hello_fuse_operations () { getattr = hello_getattr; readdir = hello_readdir; open = hello_open; read = hello_read; } } 

Luego declara una instancia estática de la nueva estructura:

 static struct hello_fuse_operations hello_oper; 

Las pruebas funcionaron bien para mí (pero esto depende del diseño de memoria de C-struct y C ++ – la estructura será la misma, no estoy seguro de que esté garantizado)

* ACTUALIZACIÓN *

Aunque este enfoque funcionó bien en la práctica, posteriormente convertí mi código para usar una clase de utilidad, es decir, una clase con un solo método de “inicialización” estática que toma una referencia a una estructura de operación de fusibles y la inicializa. Esto evita cualquier posible incertidumbre con respecto al diseño de la memoria, y sería mi enfoque recomendado en general.

quizás pueda escribir una función param variable que tome como entrada los punteros de la función y asigne el rest de los atributos como NULL. Como solo tiene una estructura – operaciones de fusible, puede implementar la función para una sola estructura. algo como init_struct (int no_op, …) en el que se pasan los punteros a las implementaciones. Es demasiado complejo y laborioso, pero supongo que puedes escribirlo una vez y usarlo siempre …