【问题标题】:c++ compiler error "was not declared in this scope"c ++编译器错误“未在此范围内声明”
【发布时间】:2011-10-08 13:55:10
【问题描述】:

我在尝试编译 c++ UDP 客户端程序时遇到一个奇怪的编译器错误。

g++ -o 客户端 Udp.cpp ClientMain.c -I. -lpthread

在 ClientMain.c:1:0 中包含的文件中:

Udp.h:在析构函数“CUdpMsg::~CUdpMsg()”中:

Udp.h:103:43: 错误:此范围内未声明“免费”

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>

应该在 string.h 中声明像“memcpy”这样的函数...我已经声明了它(以及字符串和 cstring),但我仍然收到这些编译器错误。有谁知道为什么会这样?谢谢。

【问题讨论】:

  • 您说您的 "cpp" 文件中包含这些内容,但错误在 ClientMain.c(注意 .c,而不是 .cpp)中?跨度>
  • 我认为您需要将其中一些文件包含在UDP.h
  • 你是否为这个函数调用指定了std命名空间
  • @triclosan:如果包含 C 标头(即 .h 标头),则无需指定 std::malloc
  • @MSalters:我同意。但同时包含&lt;stdlib.h&gt;&lt;cstdlib&gt; 并不是一个好习惯。

标签: c++ g++ compiler-errors


【解决方案1】:

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

【讨论】:

  • 或者必须在所有翻译单元中将它们包含在Udp.h 之前(虽然这将是不好的做法)。
【解决方案2】:

Mark B 涵盖了您的错误的所有确切原因。我只想补充一点,您应该尽量不要在一个 cpp 文件中混合两种风格的 C 头文件(#include &lt;cHEADER&gt;#include &lt;HEADER.h&gt;)。

#include &lt;cHEADER&gt; 变体将所有包含的声明带入 std:: 命名空间。 #include &lt;HEADER.h&gt; 文件不包含声明。当您需要std::malloc() 但需要::strncpy() 时,维护代码很烦人。为每个文件选择一种方法,或者最好为整个项目选择一种方法。

作为一个单独的问题,您遇到了一种情况,即标题本身并不包含它需要的所有内容。调试起来可能很烦人,因为错误可能会根据包含顺序出现或消失。

如果你创建了一个 header/cpp 对,总是让匹配的 header 成为 cpp 文件中的第一个包含,这将保证 header 是完整的并且可以独立存在。如果您创建一个不需要实现的独立标头,您仍然可以创建一个空的 .cpp 来测试标头的包含完整性,或者仅通过编译器自行运行标头。对您创建的每个标题执行此操作将防止像您当前的标题一样令人头疼。

【讨论】:

    【解决方案3】:

    如果您有多个文件,那么您需要在每个文件中包含适当的内容。也可能它不在命名空间内?

    【讨论】:

      【解决方案4】:

      一个更简洁的解决方案可能是将CUdpMsg::~CUdpMsg 的实现从udp.h 移动到udp.cpp,以及类似的任何给您此类错误的函数。如果函数真的很简单(例如 getter),则只在标头中定义函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多