首页 文章

c编译器错误“未在此范围内声明”

提问于
浏览
5

尝试编译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 回答

  • 0

    如果您有多个文件,则需要在每个文件中包含相应的包含 . 也许它不在命名空间内?

  • 5

    您的 Udp.h 文件还需要包含所需的系统标头 . 此外,由于您使用 cstringcstdlib 作为包含,因此您需要使用 std:: 限定所有C库函数,因为它们不会被这些标头自动导入全局命名空间 .

  • 5

    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 执行此操作可以防止您当前的头痛 .

  • 4

    一个更干净的解决方案可能是将 CUdpMsg::~CUdpMsg 的实现从 udp.h 移动到 udp.cpp ,类似地任何给你这样的错误的函数 . 如果它们非常简单(例如getter),则只在头文件中定义函数 .

相关问题