[英]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.