尝试编译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>
像'memcpy'这样的函数应该在string.h中声明...我已经声明了它(和string和cstring),我仍然遇到这些编译器错误 . 有没有人知道为什么会这样?谢谢 .
4 回答
如果您有多个文件,则需要在每个文件中包含相应的包含 . 也许它不在命名空间内?
您的
Udp.h
文件还需要包含所需的系统标头 . 此外,由于您使用cstring
和cstdlib
作为包含,因此您需要使用std::
限定所有C库函数,因为它们不会被这些标头自动导入全局命名空间 .Mark B涵盖了错误的所有确切原因 . 我只想补充一点,你应该尽量不要在一个cpp文件中混合两种C Headers (
#include <cHEADER>
vs#include <HEADER.h>
) .#include <cHEADER>
变体将所有包含的声明带入std :: namespace .#include <HEADER.h>
文件包括声明 . 当你需要std::malloc()
但是::strncpy()
时,维护代码很烦人 . 为每个文件选择一种方法,或者更优选地,为整个项目选择一种方法 .作为一个单独的问题,您遇到过一种情况,其中 Headers 本身并不包含它所需的一切 . 这可能会令调试烦人,因为根据包含顺序,错误可能会出现或消失 .
如果您创建一个header / cpp对,请始终将匹配的标头作为cpp文件中的第一个包含,这将保证标头完整并且可以独立存在 . 如果您创建一个不需要实现的独立标头,您仍然可以创建一个空的.cpp来测试包含完整性的标头,或者只是通过编译器自己运行标头 . 对您创建的每个 Headers 执行此操作可以防止您当前的头痛 .
一个更干净的解决方案可能是将
CUdpMsg::~CUdpMsg
的实现从udp.h
移动到udp.cpp
,类似地任何给你这样的错误的函数 . 如果它们非常简单(例如getter),则只在头文件中定义函数 .