Problema: me gustaría escribir un ejemplo de código que sea compatible entre C y C++.
Tengo una estructura de datos simple (POD) como esta, por ejemplo ...
typedef struct blob { int size; uint8_t * data; } blob;¿Hay una manera simple de inicializar esto en cero que sea válida tanto en C como en C++?
Si entiendo correctamente, los siguientes inicializadores no son válidos en ambos idiomas:
blob b = {0}; // valid C, invalid C++ blob b = {}; // valid C++, invalid CLo mejor que he encontrado hasta ahora es:
blob b = {0,0};... lo cual está bien, pero la estructura real tiene 8 campos y eso es entrar en territorio de error tipográfico.
Pregunta: ¿Se utiliza una convención común o una forma de inicialización de compatibilidad cruzada que no requiera el conocimiento de los campos?
Bien, las macros son el engendro del diablo, pero ¿sería esto de algún interés?
#ifdef __cplusplus #define ZERO_INIT #else #define ZERO_INIT 0 #endif ... blob b = {ZERO_INIT};¿O tal truco es demasiado travieso en el código del tutorial?
(Editado para reflejar sugerencias en los comentarios).
Esta declaración
blob b = {0};es válido tanto en C como en C++.
Si el compilador de C++ es compatible con el estándar C++ 20, también puede escribir
blob b = { .size = 0, .data = 0 };