2012-07-09 26 views
7

Przyjrzałem się wcześniejszym pytaniom, ale nadal nie byłem zadowolony, dlatego zamieszczam to. Próbowałem skompilować kod C++ napisany przez kogoś innego.Błąd C++: oczekiwane wyrażenie pierwotne przed "." Tokenem

/* 
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 } 
}; 

W komplecie ze std C++ 11 i otrzymuję poniżej błędu. Dlaczego '.' został użyty w kodzie podczas przypisywania wartości?

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 

Nie mogłem zrozumieć przyczyny błędu. Proszę pomóż.

+0

które linie są numer 34,35,36? –

+3

Otrzymałeś kod C, a nie C++. Spróbuj kompilatora C. –

+0

Nie jesteś pierwszą osobą, która ma ten problem: http://stackoverflow.com/q/855996/1025391 – moooeeeep

Odpowiedz

3

To, co napisałeś, to kod C, a nie kod C++ (zwróć uwagę na rozszerzenie pliku .c). Jednak następujący kod:

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

powinien działać poprawnie.

Można również przeczytać o C++ 11 zainicjować list w wiki.

+0

Dzięki za Twoje dane wejściowe. –

+0

Ale moim wymaganiem jest skompilowanie źródła jako C++ dla wbudowanych procesorów ARMv7. Ponieważ inne pliki zostały skompilowane z opcjami C++, muszę skompilować powyższy kod również w C++. Działa z kompilatorem C, ale chcę go skompilować w C++ :( –

+0

@AshokaK, więc nie możesz zmienić kodu? – SingerOfTheFall

1

Wyznaczone inicjatory agregujące to funkcja C99, tj. Jest to funkcja języka C. Nie występuje w C++.

Jeśli nalegać na kompilowanie go jak C++, musisz przepisać inicjalizacji cfg.

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

Ten kod wykorzystuje funkcję C99 nazwie wyznaczone inicjalizatory. Jak zauważyłeś, funkcja ta nie jest dostępna w C++ i C++ 11.


Jak sugerowano w this answer należy użyć kompilatora C dla kodu C. Możesz nadal połączyć go z aplikacją C++. Możesz użyć cmake, aby wykonać konfigurację kompilacji dla ciebie. Prosty przykład:

/* 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) 

wystarczy uruchomić mkdir build; cd build; cmake ..; make z katalogu źródłowego.

+0

@ moooeeeep ... Dzięki za to. Sprawdzę rozwiązanie. Jak ktoś powiedział: "Młotki do paznokci, śrubokręty do śrub ... Dla ludzi ...? :) :)" –

-1

Dzięki wszystkim ...

Po całej analizie okazało się, że powyższy kod ma C99 funkcję o nazwie
przeznaczona initializer.

Aby skompilować ten kod w C++, zmieniono normalny kod na poniższy.

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

/* 
* 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 */ 

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

Ten kod został poprawnie skompilowany bez błędu w C++.

$$ g ++ -c initialze_list.cpp

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

+0

powinieneś zaakceptować [SingerOfTheFall] (http://stackoverflow.com/a/11395350/1025391) to odpowiedź, tak myślę. – moooeeeep

Powiązane problemy