簡體   English   中英

錯誤消息錯誤:變量“ ...”具有初始化程序,但類型不完整

[英]error message error: variable '…' has initializer but incomplete type

編譯我的代碼時

#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;
     };

有誰知道它的來源...? 我一直在找幾個小時...

謝謝你的幫助!

在此語句中,聲明了兩個實體。

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的對象,並將其初始化為一個聚合。

正如您在評論中所說,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 ++那樣扼制。

但是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 ++具有類型限定的概念。 但這將被C編譯器拒絕...

TL / DR:即使C ++實際上是從C派生出來的,並且它們共享相同的元素,並且C標准庫中包含C標准庫,這使得一些瑣碎的C程序也可以成為C ++正確的程序,但C和C ++是不同的語言

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM