首先我想说我的英语很少,所以请原谅我的拼写错误。
我在使用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文件”上?答案 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