![](/img/trans.png)
[英]c++ error: expected primary-expression before '&' token
[英]C++ error: expected primary-expression before ‘.’ token
我看了之前的问题,但仍然不满意,因此我发布了这个。 我试图编译其他人编写的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 }
};
应该工作正常。
您还可以阅读Wiki中的C ++ 11初始化列表。
指定的聚合初始化器是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 ++应用程序。 您可以使用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
您的源目录。
谢谢大家 ...
经过所有分析后我发现上面的代码都有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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.