2012-07-09 115 views
7

Miré las preguntas anteriores pero aún así no estaba satisfecho, por lo tanto, estoy publicando esto. Estaba intentando compilar el código C++ escrito por otra persona.Error de C++: expresión primaria esperada antes del token '.'

/* 
file1.h 
*/ 
#include <stdio.h> 
#include <stdlib.h> 
typedef struct 
{ 
    struct 
    { 
     unsigned member1; 
     unsigned member2; 
    } str1; 

    struct 
    { 
     unsigned member3; 
     unsigned member4; 
    } str2; 

    struct 
    { 
     unsigned member5; 
     unsigned member6; 
    } str3; 
} CONFIG_T; 



/* 
file1.c 
*/ 
CONFIG_T cfg = 
{ 
    .str1 = { 0x01, 0x02 }, 
    .str2 = { 0x03, 0x04 }, 
    .str3 = { 0x05, 0x06 } 
}; 

Compilado con std C++ 11 y obtengo el siguiente error. Porqué el '.' se ha utilizado en el código al asignar valores?

home $$ g++ -c -std=gnu++0x initialze_list.cpp 

initialze_list.cpp:34: error: expected primary-expression before ‘.’ token 

initialze_list.cpp:35: error: expected primary-expression before ‘.’ token 

initialze_list.cpp:36: error: expected primary-expression before ‘.’ token 

No pude entender el motivo del error. Por favor ayuda.

+0

qué líneas están número 34,35,36? –

+3

Le han dado el código C, no el código C++. Pruebe un compilador de C –

+0

No es la primera persona que tiene este problema: http://stackoverflow.com/q/855996/1025391 – moooeeeep

Respuesta

3

Lo que ha publicado es el código C, no el código C++ (tenga en cuenta la extensión del archivo .c). Sin embargo, el siguiente código:

CONFIG_T cfg = 
{ 
    { 0x01, 0x02 }, 
    { 0x03, 0x04 }, 
    { 0x05, 0x06 } 
}; 

debería funcionar bien.

También puede leer sobre las listas de inicialización de C++ 11 en el wiki.

+0

Gracias por sus entradas. –

+0

Pero mi requisito es que tengo que compilar la fuente como C++ para procesadores integrados ARMv7. Como se compilaron otros archivos con las opciones de C++, tengo que compilar el código mencionado anteriormente también en C++. Funciona con C Compiler, pero quiero que se compile en C++ :( –

+0

@ AshokaK, por lo que no puede cambiar el código? – SingerOfTheFall

1

Los inicializadores agregados designados son una característica C99, es decir, es una característica del lenguaje C. No está presente en C++.

Si insiste en compilarlo como C++, tendrá que volver a escribir la inicialización de cfg.

1
/* 
file1.c 
*/ 
CONFIG_T cfg = 
{ 
    .str1 = { 0x01, 0x02 }, 
    .str2 = { 0x03, 0x04 }, 
    .str3 = { 0x05, 0x06 } 
}; 

Ese código está utilizando una característica llamada C99 inicializadores designados. Como ha observado, esa característica no está disponible en C++ y C++ 11.


Como se sugiere en this answer se debe utilizar un compilador de C para el código C. Todavía puede vincularlo a su aplicación C++. Puede usar cmake para hacer la configuración de compilación para usted. Un ejemplo sencillo:

/* f1.h */ 
#ifndef MYHEADER 
#define MYHEADER 

typedef struct { int i, j; } test_t; 
extern test_t t; 

#endif 

/* f1.c */ 
#include "f1.h" 
test_t t = { .i = 5, .j = 6 }; 

/* f0.cc */ 
extern "C" { #include "f1.h" } 
#include <iostream> 

int main() { 
    std::cout << t.i << " " << t.j << std::endl; 
} 

# CMakeLists.txt 
add_executable(my_executable f0.cc f1.c) 

simplemente correr mkdir build; cd build; cmake ..; make de su directorio de origen.

+0

@ moooeeeep ... Gracias por eso. Verificará la solución. Como alguien dijo "Martillos para clavos, destornilladores para tornillos ... Para humanos ...? :) :)" –

-1

Gracias a todos ...

Después de todo el análisis me encontré con que el código anterior tiene función llamada C99
inicializador designado.

Para compilar este código en C++ he cambiado el código a la inicialización normal como se muestra a continuación.

==========================

/* 
* initialze_list.cpp 
*/ 

#include <stdio.h> 

typedef struct 
{ 
    struct 
{ unsigned member1; 
    unsigned member2; 
} str1; 
struct 
{ unsigned member3; 
    unsigned member4; 
} str2; 
struct 
{ unsigned member5; 
    unsigned member6; 
} str3; 
} CONFIG_T; 

CONFIG_T cfg = 
{ 
{ 0x01, 0x02 }, 
{ 0x03, 0x04 }, 
{ 0x05, 0x06 } 
}; 
/* End of file */ 

============= =====================

Este código compilado correctamente sin el error en C++.

$$ g ++ -c initialze_list.cpp

$$ g ++ -c -std = gnu ++ 0x initialze_list.cpp

+0

debes aceptar [SingerOfTheFall] (http://stackoverflow.com/a/11395350/1025391) La respuesta de entonces, creo. – moooeeeep

Cuestiones relacionadas