简单的一点代码。到目前为止,它显然是不完整的,但它应该可以编译。我正在将它从 Visual Studio 转换为 Linux。当我使用 g++ test.cpp 编译时,出现此错误:


#ifndef _STRING_H
#define _STRING_H

#include <cstring>
#include "ArrayClass.h"
#include "Exception.h"

class String : virtual public ArrayClass<char>
{

public:
    String();
    String(char* s);

};

String::String() : ArrayClass<char>(1,'\0') {}

String::String(char* s) : ArrayClass<char>(std::strlen(s)+1)
{
    std::strcpy(pointer_Object, s);
}

#endif

似乎我已经来回地解决了它。有任何想法吗?

用这些编译:
  • libgcc-4.9.2-6.fc21.i686
  • gcc-4.9.2-6.fc21.x86_64
  • gcc-c++-4.9.2-6.fc21.x86_64
  • libgcc-4.9.2-6.fc21.x86_64
  • 最佳答案

    看来您已经破解了 string.h 的包含保护。

    #ifndef _STRING_H
    #define _STRING_H
    

    这样做是违法的,并且不清楚你为什么这样做。 #include <cstring> 就是必需的。

    可能的结果是 <string.h> 被忽略,这将导致 <cstring> 期望的全局命名空间中缺少某些内容。

    编辑:啊,现在我明白了。您的标题也被命名为 "string.h"

    下划线开头后跟大写字母的名称保留给实现:编译器和标准库。它们可以是内部使用的运算符,也可以是内部变量(例如系统 header 的包含保护)。试试这个:
    #ifndef INCLUDED_SEANS_STRING_H
    #define INCLUDED_SEANS_STRING_H
    

    由于宏都集中在一个命名空间中,因此您可以使用不与其他任何内容冲突的宏名称。有些人甚至将 UUID 放在标题守卫中;我只是提到图书馆的名字。

    关于c++ - std::strcpy 未在此范围内声明 DESPITE #include <cstring>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31691168/

    10-13 06:40