编译我的代码时
#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;
};
有没有人知道它来自哪里......?我一直在寻找...... ...
感谢您的帮助!
答案 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 ++是不同的语言。