7

我看了前面的问题,但我仍然不满意,因此我发布了这个。我试图编译别人编写的 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 }
};

用标准 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

我无法理解错误的原因。请帮忙。

4

4 回答 4

4

您发布的是 C 代码,而不是 C++ 代码(注意 .c 文件扩展名)。但是,以下代码:

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

应该可以正常工作。

您还可以在wiki中阅读有关 C++11 初始化列表的信息。

于 2012-07-09T12:49:09.403 回答
1
/* 
file1.c
*/
CONFIG_T  cfg =
{
  .str1 = { 0x01, 0x02 },
  .str2 = { 0x03, 0x04 },
  .str3 = { 0x05, 0x06 }
};

该代码使用称为指定初始化程序的 C99 功能。正如您所观察到的,该功能在 C++ 和 C++11 中不可用。


正如此答案中所建议的,您应该为 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从您的源目录运行。

于 2012-07-09T14:23:48.657 回答
1

指定聚合初始值设定项是 C99 的一个特性,即它是 C 语言的一个特性。它在 C++ 中不存在。

如果您坚持将其编译为 C++,则必须重写cfg.

于 2012-07-09T14:22:23.220 回答
0

谢谢大家 ...

经过所有分析后,我发现上面的代码具有 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++ 中的错误。

$$ g++ -c initialze_list.cpp

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

于 2012-07-10T08:37:02.837 回答