失败包括C中的库

时间:2014-05-24 16:59:10

标签: c

首先我想说我的英语很少,所以请原谅我的拼写错误。

我在使用Code:Blocks as IDE

编译C中的某些库时遇到问题

我有以下代码:

//main.c

#include "lib1.h"

int main(){

}

“lib1.h”是

#ifndef GUARD_LIB1
#define GUARD_LIB1

MyTypedef variable123;

#endif

“lib1.c”是

#include "lib2.h"
#include "lib1.h"

最后,“lib2.h”是

#ifndef GUARD_LIB2
#define GUARD_LIB2

typedef int MyTypedef;

#endif

但总是给我编译错误,不能在“lib1.h”中识别MyTypedef,有什么建议吗?

错误是:

"Unknow type name: 'MyTypedef'"

EIDT:

我遇到问题的真正代码是。

// EnzoLib.c
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include "EnzoLib.h"




// EnzoLib.h

//blah blah blah...

//Estructuras
typedef struct {
    SOCKET sock;
    char nombre[64];
    char activo;
    struct sockaddr_in from;
} Socket;

//blah blah blah...

和main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include "EnzoLib.h"

和错误:

C:\Users\Enzo\Documents\codeblocks\lp1\ServidorChat\EnzoLib.h|6|error: unknown type name 'SOCKET'|

我应该在main.c中的#include“EnzoLib.h”之前添加#include吗?我只使用我在EnzoLib.h中声明的函数

EDIT2:

是的,我正在尝试编写一个整洁的方式。不要将“#includes”始终放在“.C文件”上?

2 个答案:

答案 0 :(得分:1)

在编译main.c时,永远不会包含包含lib2.h定义的标题MyTypedef。因此,在编译main.c时,编译器不知道该类型是什么。

也就是说,在预处理器运行之后,编译器会看到两个“转换单元”(标准调用一个c文件,它所包含的所有头文件都是一个翻译单元):

main.c变为:

//main.c

#ifndef GUARD_LIB1
#define GUARD_LIB1

MyTypedef variable123;

#endif

int main(){

}

lib1.c变为:

#ifndef GUARD_LIB2
#define GUARD_LIB2

typedef struct int MyTypedef;

#endif
#ifndef GUARD_LIB1
#define GUARD_LIB1

MyTypedef variable123;

#endif

lib1.c中,编译器知道MyTypedef是什么,但在main.c中却不知道。

如果要在标头中使用类型,则标头应包含其依赖项。 lib1.h包括lib2.h,以便使用lib1.h的任何人都可以告诉MyTypedef是什么。

答案 1 :(得分:0)

将包含的文件从EnzoLib.c移动到EnzoLib.h,只保留#include“EnzoLib.h”

EnzoLib.h的内容应该类似于

#ifndef ENZOLIB_H
#define ENZOLIB_H

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>

typedef struct {
    SOCKET sock;
    char nombre[64];
    char activo;
    struct sockaddr_in from;
} Socket;

#endif
//end of EnzoLib.h

EnzoLib.c的内容应该在线

#include "EnzoLib.h"

//Freely use the Socket structure
Socket mySocket;

//end of EnzoLib.c