在两个头文件中使用特殊类型的麻烦。 (C代码)

时间:2016-04-14 19:22:02

标签: c

我在使用两个头文件中的特殊类型时遇到问题。一个头文件定义了类型,另一个头文件在外部变量和函数中使用它。

"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文件中遇到了大量涉及“冲突类型”的错误。

2 个答案:

答案 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)。