lenguaje infinitos gotoxy función funcion etiquetas ejemplos definicion ciclos c++ static tags struct initialization

c++ - infinitos - if en c



Inicialización de estructura estática con etiquetas en C++ (3)

He buscado una respuesta en stackoverflow pero no puedo obtener algo relevante.

Intento inicializar una instancia de estructura estática con valores iniciales especificando sus etiquetas, pero aparece un error en el momento de la compilación:

src/version.cpp:10: error: expected primary-expression before ''.'' token

Aquí está el código:

// h typedef struct { int lots_of_ints; /* ... lots of other members */ const char *build_date; const char *build_version; } infos;

Y el código defectuoso:

// C static const char *version_date = VERSION_DATE; static const char *version_rev = VERSION_REVISION; static const infos s_infos = { .build_date = version_date, // why is this wrong? it works in C! .build_version = version_rev }; const infos *get_info() { return &s_infos; }

Entonces, la idea básica es eludir la inicialización de "otros miembros" y solo establecer los build_date relevantes build_date y build_version . Esto solía funcionar en C, pero no puedo entender por qué no funcionará en C ++.

¿Algunas ideas?

editar :

Me doy cuenta de que este código parece una simple C, y realmente lo es. Todo el proyecto está en C ++, así que tengo que usar las extensiones de archivo C ++ para evitar el lío de dependencia de los archivos ( %.o: %.cpp )


Creo que esto se agregó como una característica en C99, pero nunca ha sido una característica estándar en C ++.

Sin embargo, algunos compiladores probablemente lo ofrecen como una extensión de idioma no estándar.


El siguiente código de ejemplo define una estructura en lo que considero una forma más C ++ (sin necesidad de typedef) y usa un constructor para resolver su problema:

#include <iostream> #define VERSION_DATE "TODAY" #define VERSION_REVISION "0.0.1a" struct infos { int lots_of_ints; /* ... lots of other members */ const char *build_date; const char *build_version; infos() : build_date(VERSION_DATE), build_version(VERSION_REVISION) {} }; static const infos s_infos; const infos *get_info() { return &s_infos; } int main() { std::cout << get_info()->build_date << std::endl; std::cout << get_info()->build_version << std::endl; return 0; }


La característica que está utilizando es una característica C99 y está utilizando un compilador C ++ que no lo admite. Recuerde que aunque el código C es generalmente válido como código C ++, el código C99 no siempre es así.