错误消息错误:变量'...'具有初始化程序但不完整的类型

时间:2017-04-05 15:00:55

标签: c struct

编译我的代码时

#include "macro.h"
#ifndef FIT_IT
#define FIT_IT
#endif
#define MAXPOINTS 10000
using namespace std;
double calc_chi2(int iloop, void *params){

struct func_params *part = (struct func_params *)params;
struct fit_data     fd   = part->fd;
...}

int main(int argc, char **argv){
FILE *fp;
size_t size;
int i;
struct func_params part;
setbuf(stdout,NULL);
initialize(argc, argv,&part);
...
}

我收到错误消息:error: variable ‘fit_data fd’ has initializer but incomplete type。结构在标题'macro.h'中定义:

struct func_params
{   
    ...
    struct fit_data{
    char   data_file[100];
    size_t n;
    double nu;
    int    id;
    double lognumin;
    double lognumax;
    double xval[1000];
    double yval[1000];
    double yerr[1000];
          } fd;
     };

有没有人知道它来自哪里......?我一直在寻找...... ...

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在此声明中,声明了两个实体。

struct fit_data     fd   = part->fd;

第一个是尚未定义的结构fit_data。第二个是名为fd的结构的对象。编译器无法执行初始化,因为它不知道如何定义结构。

您必须使用限定名称。例如

func_params::fit_data     fd   = part->fd;

因为结构fit_data被声明并定义为结构func_params的内部成员

从代码片段中还不清楚fd是定义为单独的全局对象还是表示结构struct func_params的数据成员。在最后一种情况下,您必须定义struct func_params类型的对象并将其初始化为聚合。

答案 1 :(得分:1)

正如你在评论中所说,C和C ++是不同的语言!

C版本是:

double calc_chi2(int iloop, void *params){

struct func_params *part = (struct func_params *)params;
struct fit_data     fd   = part->fd;
...}

因为C中没有类型的嵌套,所以它编译得很好,但是像C ++一样扼杀。

但是C ++版本是:

double calc_chi2(int iloop, void *params){

struct func_params *part = (struct func_params *)params;
struct funt_params::fit_data     fd   = part->fd;
...}

因为C ++是OO语言具有类型限定的概念。但是这个将被C编译器拒绝......

TL / DR:即使C ++实际上是从C派生的,如果它们共享共同的元素,并且如果C标准库包含在C ++标准库中,这允许一些简单的C程序也是C ++正确的程序, C和C ++是不同的语言