2011-04-26 21 views
5

He buscado una respuesta en stackoverflow pero no puedo obtener algo relevante.Inicialización de estructura estática con etiquetas en C++

Estoy tratando de inicializar una instancia de estructura estática con los valores iniciales especificando sus etiquetas, pero me da un error en tiempo de 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; 
} 

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

¿Alguna idea?

edición:

realizo este código es sencillo C, y que en realidad es. Todo el proyecto está en C++, así que tengo que usar extensiones de archivos C++ para evitar el lío de dependencia de archivos make (%.o: %.cpp)

+2

* ¿Por qué es malo? funciona en C! * Principalmente porque C y C++ son * idiomas * diferentes. –

+1

@David - pero con suficiente en común, y con una derivada originalmente del otro, y con el intercambio continuo de ideas, por lo que estresarse acerca de la confusión es injusto. Algunas partes de C99 ya se han importado a C++ 0x, como "long long". – Steve314

+0

@ Steve314: No me malinterpreten, no estoy estresado por la confusión (no estoy estresado en absoluto), pero no hay confusión en la pregunta: ¡él sabe que son idiomas diferentes! Me resulta interesante cuando la gente dice que debido a que una característica funciona en C it * tiene * que trabajar en C++. Considere esto, o 'void f (int x) {int array [x]; ...} 'Son idiomas diferentes, y si bien comparten un pasado común, no siempre comparten el futuro. –

Respuesta

6

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í.

+1

Para explicar un poco más: aunque originalmente C++ tenía un objetivo de compatibilidad con C, no tiene sentido mantener la compatibilidad "lateral" a largo plazo. El código escrito en C pero llamado desde C++ es un problema para ambos: la interfaz no puede ajustarse a las convenciones de C++, pero impone restricciones y gastos generales a los compiladores de C (p.propagación de excepción a través de las funciones C) que hace que algunos chicos C soplen humo por las orejas. – Steve314

4

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.

4

El siguiente código de ejemplo define una estructura en lo que considero una manera más C++ (sin necesidad de typedef) y utiliza 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; 
} 
+0

Este estilo de inicialización tiene una sobrecarga de tiempo de ejecución que no existe en la versión C99, al menos en principio, aunque normalmente no será una gran sobrecarga y no me sorprendería que algunos compiladores puedan optimizar la inicializaciones en algunos casos, efectivamente dando el mismo resultado que la sintaxis C99. No debería necesitar mucho más que la evaluación de funciones en tiempo de compilación y en tiempo de ejecución de expresiones constantes para manejar eso en este caso. – Steve314

+0

@Steve - cierto, pero tiene la ventaja de ser un C++ válido, ¡eso es un plus (más) en mi libro! :) –

+0

Aunque me gusta esto, la sobrecarga de tiempo de ejecución no es lo que quiero. Me atendré a la antigua definición estática "completa". Gracias de cualquier manera :) – Gui13

Cuestiones relacionadas