2012-07-09 152 views
7

我看了一下前面的問題,但仍然不滿意,因此我發佈了這個。 我試圖編譯別人編寫的C++代碼。C++錯誤:'。'之前預期的主表達式令牌

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

編譯與std C++ 11,我得到以下錯誤。爲什麼 '。'已在代碼 中使用,同時分配值?

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 

我無法理解錯誤的原因。請幫忙。

+0

哪些線是編號34,35,36? – 2012-07-09 12:48:32

+3

您已獲得C代碼,而不是C++代碼。嘗試一個C編譯器。 – 2012-07-09 12:49:23

+0

您不是第一個有此問題的人:http://stackoverflow.com/q/855996/1025391 – moooeeeep 2012-07-09 14:24:55

回答

3

你發佈的是C代碼,而不是C++代碼(注意.c文件的擴展名)。但是,下面的代碼:

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

應該可以正常工作。

您還可以閱讀wiki中的C++ 11初始化列表。

+0

感謝您的輸入。 – 2012-07-09 13:09:02

+0

但我的要求是我必須將源代碼編譯爲C++ for ARMv7嵌入式處理器。由於其他文件是用C++選項編譯的,所以我必須在C++中編譯上述代碼。它適用於C編譯器,但我希望它在C++編譯:( – 2012-07-09 13:10:41

+0

@AshokaK,所以你不能更改代碼? – SingerOfTheFall 2012-07-09 13:15:58

1

指定的集合初始值設定項是一個C99特徵,即它是C語言的一個特徵。它不在C++中。

如果你堅持把它編譯爲C++,你必須重寫cfg的初始化。

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

該代碼將使用稱爲指定初始化 C99的功能。正如您所觀察到的,該功能在C++和C++ 11中不可用。


正如this answer建議你應該使用C++代碼的C編譯器。您仍然可以將其鏈接到您的C++應用程序。您可以使用cmake爲您執行構建配置。一個簡單的例子:

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

只需運行從源目錄mkdir build; cd build; cmake ..; make

+0

@ moooeeeep ... 謝謝你。將檢查解決方案。 正如有人所說:「錘子的釘子,螺絲刀的螺絲... 人類...?:) :)」 – 2012-07-10 09:18:40

-1

感謝所有...

後,所有的分析,我發現上面的代碼中有一個名爲
指定初始化 C99功能。

要在C++中編譯此代碼,我已將代碼更改爲正常初始化,如下所示。

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

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

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

這段代碼編譯正確,沒有C++中的錯誤。

$$克++ -c initialze_list.cpp

$$克++ -c -std = GNU ++ 0x中initialze_list.cpp

+0

你應該接受[SingerOfTheFall](http://stackoverflow.com/a/11395350/1025391)然後我想。 – moooeeeep 2012-07-10 13:14:35

相關問題