项目场景:
在最近使用socket写p2p程序时,写了一个socket_server类文件(class声明写入.h,实现写入.cpp,在引入main.cpp时出现标题错误。)
问题描述:
- error C4430: 缺少类型说明符 - 假定为 int。
- error C3646: 未知重写说明符
- error C2039: “xxx”: 不是 “xxx” 的成员
原因分析:
- socket_server.cpp中引入了thread.h和mutex.h以及Winsock.h等头文件,在socket_server.h中只有最纯粹的class声明,其余实现文件和引入的头文件都写在.cpp中。部分代码示例如下:
socket_server.h
#pragma once
typedef std::vector<std::thread*> VectorThread;
class socket_server
{
private:
SOCKET skfd_server;
int LastErroFlag;
int af;
char ServerIP[50];
UINT port;
bool IfInitEnvSucess;
bool IfCreateServerSocketSucess;
VectorThread threads;
bool InitEnviroment();
bool ServerCreateSocket();
bool ServerBind();
bool ServerListen();
void ServerAccept();
void ShowError();
bool Thread2ProcessNewPeer(SOCKET newpeersocket);
public:
socket_server();
~socket_server();
};
socket_server.cpp
#include <iostream>
#include <Winsock2.h>
#include <thread>
#include <vector>
#pragma comment(lib, "ws2_32.lib")
#include "socket_server.h"
......
......
......
- 在main函数中只引入了socket_server.h,示例如下:
#include <iostream>
#include "socket_server.h"
int main()
{
return 0;
}
根本原因:
(1) 编译器是以源文件为单位的,处理头文件时会将头文件释放在被引入的源文件中(当main.cpp
中注释掉#include "socket_server.h"
错误就会消失);
(2) 当将socket_server.h
在main.cpp
释放时问题就来了,socket_server.h
所依赖的头文件全在socket_server.cpp
中,而main.cpp
没有引入<vector>
和<Win32.h>
。
解决方案:
- 将头文件声明中所依赖的库文件放到头文件中;
- 将头文件复制一份写在main.cpp中;
- 引入
pch.h
,将公共依赖头文件写入其中,在需要的地方都写上#include<pch.h>
。