Mik*_*ike 6 c++ compiler-errors g++
尝试编译c ++ UDP客户端程序时,我遇到了一个奇怪的编译器错误.
g ++ -o client Udp.cpp ClientMain.c -I.-lpthread
在ClientMain.c中包含的文件中:1:0:
Udp.h:在析构函数'CUdpMsg :: ~CUdpMsg()'中:
Udp.h:103:43:错误:在此范围内未声明'free'
Udp.h:在成员函数'void CUdpMsg :: Add(in_addr_t,const void*,size_t)'中:
Udp.h:109:34:错误:在此范围内未声明'malloc'
Udp.h:109:41:错误:'memcpy'未在此范围内声明
ClientMain.c:在函数'int main(int,char**)'中:
ClientMain.c:28:57:错误:在此范围内未声明'memcpy'
ClientMain.c:29:61:错误:在此范围内未声明'printf'
ClientMain.c:30:17:错误:在此范围内未声明'stdout'
ClientMain.c:30:23:错误:'fflush'未在此范围内声明
ClientMain.c:34:68:错误:未在此范围内声明'printf'
ClientMain.c:35:17:错误:在此范围内未声明'stdout'
ClientMain.c:35:23:错误:'fflush'未在此范围内声明
ClientMain.c:37:30:错误:'usleep'未在此范围内声明
我在cpp文件的开头声明了以下内容.
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <cstdlib>
#include <string>
#include <stdlib.h>
#include <cstring>
#include <errno.h>
Run Code Online (Sandbox Code Playgroud)
像'memcpy'这样的函数应该在string.h中声明...我已经声明了它(和string和cstring),我仍然遇到这些编译器错误.有没有人知道为什么会这样?谢谢.
您的Udp.h文件还需要包含所需的系统标头.此外,由于您使用cstring和cstdlib作为包含,因此您需要限定所有C库函数,std::因为它们不会被这些标头自动导入到全局命名空间中.
Mark B涵盖了错误的所有确切原因.我只想补充一点,你应该尽量不要在一个cpp文件中混合使用两种C头文件(#include <cHEADER>vs #include <HEADER.h>).
该#include <cHEADER>变体将所有包含的声明带入std :: namespace.该#include <HEADER.h>文件包含的声明没有.这是恼人的,当你需要维护的代码std::malloc(),但::strncpy().为每个文件选择一种方法,或者更优选地,为整个项目选择一种方法.
作为一个单独的问题,您遇到过这样一种情况:标头本身并不包含它所需的一切.这可能会令调试烦人,因为根据包含顺序,错误可能会出现或消失.
如果您创建一个header/cpp对,请始终使匹配的标头成为cpp文件中的第一个包含,这将保证标头完整并且可以独立存在.如果您创建一个不需要实现的独立标头,您仍然可以创建一个空的.cpp来测试包含完整性的标头,或者只是通过编译器自己运行标头.对您创建的每个标题执行此操作可以防止像您当前的标题一样令人头痛.