【问题标题】:‘memcpy’ was not declared in this scope'memcpy' 未在此范围内声明
【发布时间】:2014-09-11 02:17:31
【问题描述】:

我正在尝试使用 gcc 和 eclipse 构建一个开源 c++ 库。 但我得到这个错误 'memcpy' 未在此范围内声明

我尝试包含 memory.h(和 string.h),如果我单击“打开声明”,eclipse 会找到该函数,但 gcc 给我错误。

我该怎么办?

#include <algorithm>
#include <memory.h>

namespace rosic
{
   //etc etc
template <class T>
  void circularShift(T *buffer, int length, int numPositions)
  {
    int na = abs(numPositions);
    while( na > length )
      na -=length;
    T *tmp = new T[na];
    if( numPositions < 0 )
    {

      memcpy(  tmp,                buffer,              na*sizeof(T));
      memmove( buffer,            &buffer[na], (length-na)*sizeof(T));
      memcpy( &buffer[length-na],  tmp,                 na*sizeof(T));
    }
    else if( numPositions > 0 )
    {
      memcpy(  tmp,        &buffer[length-na],          na*sizeof(T));
      memmove(&buffer[na],  buffer,            (length-na)*sizeof(T));
      memcpy(  buffer,      tmp,                        na*sizeof(T));
    }
    delete[] tmp;
  }

//etc etc
}

每个 memcpy 和 memmove 函数都有错误。

【问题讨论】:

标签: c++ gcc


【解决方案1】:

你必须要么放

using namespace std;

到另一个命名空间,或者您在每个 memcpy 或 memmove 处执行此操作:

[...]

std::memcpy(  tmp,                buffer,              na*sizeof(T));

[...]

在您的代码中,编译器不知道在哪里查找该函数的定义。如果你使用命名空间,它知道在哪里可以找到函数。

此外,不要忘记包含 memcpy 函数的标头:

#include <cstring>

【讨论】:

  • 别忘了提及正确的#include 声明。
  • OP 提到他们已经尝试过了。此外,您不应该将using namespace 语句放在标题中。
  • @BartoszKP:我认为你永远不应该在标题中使用命名空间......如果你正在使用/想要在其他文件中使用标题,你将拥有命名空间,你可能不会重新考虑(例如深度嵌套的标题包含)
  • 如果我使用gcc 会怎样?如何访问memcpy
【解决方案2】:

还有一种可能,当你做 CP 时,在某些平台,比如 USACO,它不允许你使用memcpy,因为它是 C++ 中未经检查的操作,可能会产生严重的内存错误甚至潜在的攻击.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2016-08-09
    • 2019-02-17
    相关资源
    最近更新 更多