'之前的表达'。' 代币

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

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


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

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

应该工作正常。

您还可以阅读关于C ++ 11初始化wiki的列表。


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

如果你坚持把它编译为C ++,你将不得不重写cfg的初始化。


/* 
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 mkdir build; cd build; cmake ..; make mkdir build; cd build; cmake ..; make您的源目录。

链接地址: http://www.djcxy.com/p/61239.html

上一篇: expression before ‘.’ token

下一篇: Apache POI coded formatting works with MS excel 2010 but not in excel 2003