我在使用两个头文件中的特殊类型时遇到问题。一个头文件定义了类型,另一个头文件在外部变量和函数中使用它。
"newtype.h"
typedef struct {
double i, s;
} newtype_t;
newtype_t this(){}
newtype_t that(){}
现在我有另一个带变量和函数的标题:
"newfuncs.h"
extern newtype_t c;
newtype_t divide(double d, double e);
我得到了:
unknown type name 'newtype_t' //inside of "newfuncs.h"
这个新标题“newfuncs.h”是已经工作的代码的补充,它利用了“newtype.h”中的新类型和函数。 我在newfuncs.h中使用这个newtype_t。
我尝试#include“newtype.h”但我在.c文件中遇到了大量涉及“冲突类型”的错误。
答案 0 :(得分:0)
如果标题使用在另一个标题中声明的类型,则应该包含它。
为了防止多个声明问题,您应该在头文件中添加一个保护:
// file newtype.h
#ifndef NEWTYPE_H // the guard
#define NEWTYPE_H
// all header stuff goes here
typedef int my_type;
#endif // end of guard
通过这样做,每种类型或功能将只定义一次。每个保护宏都应该是唯一的,您可以使用文件名来选择其名称。
某些编译器(如cl)有一个特殊注释,以防止多次包含:#pragma once
答案 1 :(得分:0)
您是否按正确的顺序包含了头文件?
我刚测试过它并且有效
test.c的
#include "newtype.h"
#include "newfuncs.h"
#include <stdio.h>
int main(){
double d = 4.0;
double e = 2.0;
c = divide(d, e);
printf("HELLO WORLD\n");
printf("%lf", c.i);
printf("%lf", c.s);
return 0;
}
newtype_t divide(double d, double e){
newtype_t x;
x.i = d;
x.s = e;
return x;
}
newtype.h
#ifndef NEWTYPE_H
#define NEWTYPE_H
typedef struct {
double i, s;
} newtype_t;
#endif
newfuncs.h
#ifndef NEWFUNCS_H
#define NEWFUNCS_H
newtype_t c;
newtype_t divide(double d, double e);
#endif
但即使没有定义它也适合我(gcc 5.3.1)。