简单的代码。到目前为止它显然是不完整的,但它应该编译。我正在从Visual Studio将其转换为Linux。当我用g ++ test.cpp编译时,我得到了这个错误:
在test.cpp中包含的文件中:2:0:
的成员
String.h:在构造函数中 String :: String(char *):
String.h:24:2:错误:strcpy不是 std std :: strcpy(pointer_Object,s);
#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
答案 0 :(得分:6)
看来你已经入侵了string.h
的包含守卫。
#ifndef _STRING_H
#define _STRING_H
这样做是违法的,并且不清楚你为什么这样做。 #include <cstring>
就是必要的。
可能的结果是<string.h>
被忽略,这将导致<cstring>
期望的全局命名空间中缺少事物。
"string.h"
。
以下划线后跟大写字母开头的名称保留给实现:编译器和标准库。它们可以是内部使用的运算符,也可以是内部变量(例如包含系统头的保护)。试试这个:
#ifndef INCLUDED_SEANS_STRING_H
#define INCLUDED_SEANS_STRING_H
由于宏都集中在一个名称空间中,因此您可以使用不会与其他任何内容发生冲突的宏名称。有些人甚至把UUID放在头部防护装置中;我只提到了图书馆的名称。
答案 1 :(得分:4)
在C ++中启动任何标识符都是不合法的,包括带有_后跟大写字母的宏。因此:
#ifndef _STRING_H
#define _STRING_H
应该更改为其他不违反此规则的内容。
从标准开始工作:
7.1.3保留标识符
每个标头声明或定义其关联子条款中列出的所有标识符,并可选择声明或定义其关联的未来库方向子条款和标识符中列出的标识符,这些标识符始终保留用于任何用途或用作文件范围标识符。
- 所有以下划线开头且以大写字母或其他下划线开头的标识符始终保留供任何使用。
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。
更详细一点,可能发生的事情是<cstring>
的实现使用_STRING_H
作为自己的包含守护,因此当你包含它时,它被掩盖了重复的守卫#ifdef
。正如我所说,最好的解决方案就是使用不以_
答案 2 :(得分:-4)
它不在std
命名空间中,只需使用strcpy