“memcpy”在此范围内未声明。

28

我正在尝试使用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函数时我都会遇到错误。


1
最好将您的代码添加到帖子中 - 这将有助于我们帮助您。 - NirMH
2
首先,您需要提供更多上下文信息,包括您调用gcc时使用的选项以及确切的错误信息(文件名、未编译代码的摘录、复制/粘贴确切的错误信息)。通常情况下,string.h已经与gcc捆绑在一起,不需要任何额外的选项,因此这里可能有些问题。 - Matthieu M.
1
我的猜测是你打错了 #include <string.h> 或者将其放在文件中太低的位置。请展示一些最小化可复现代码来说明问题。 - user2357112
1
你尝试过包含 cstring 并添加 using namespace std;(如果这是一个 cpp 文件)吗?(http://en.cppreference.com/w/cpp/string/byte/memcpy) - BartoszKP
显示剩余4条评论
2个回答

35

You have to either put

using namespace std;

将其它命名空间的内容复制到当前命名空间,或者在每个memcpy或memmove操作中都执行此操作:

[...]

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

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

此外,请不要忘记包含memcpy函数的头文件:

#include <cstring>

3
别忘了提及正确的 #include 声明。 - πάντα ῥεῖ
5
应该写成 #include <cstring>,这是指包含了 C++ 标准库中的字符串操作函数头文件。具体可参考链接:http://en.cppreference.com/w/cpp/string/byte/memcpy。 - πάντα ῥεῖ
2
OP提到他们已经尝试过了。此外,您不应该在头文件中放置using namespace语句。 - BartoszKP
如果我使用 gcc 呢?我该如何访问 memcpy - Royi
@Royi: `#include <string.h>void *memcpy(void *dest, const void *src, size_t n);` - Flocke
显示剩余4条评论

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接