C++ 错误:strcpy 未在此范围内声明

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2220795/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 22:36:35  来源:igfitidea点击:

error: strcpy was not declared in this scope

c++deprecated

提问by Chak

I get this problem in a c++ problem compiling in Ubuntu g++ version 4.4.3. I dont know the headers to include to solve this problem.. Thanks

我在 Ubuntu g++ 版本 4.4.3 中编译的 c++ 问题中遇到了这个问题。我不知道要包含的标题来解决这个问题..谢谢

centro_medico.cpp: In constructor ‘Centro_medico::Centro_medico(char*, char*, int, int, float)':
centro_medico.cpp:5: error: ‘strcpy' was not declared in this scope
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*'
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*'
centro_medico.cpp: In member function ‘Centro_medico& Centro_medico::operator=(const Centro_medico&)':
centro_medico.cpp:26: error: ‘strcpy' was not declared in this scope
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*'
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*'
centro_medico.cpp: In member function ‘bool Centro_medico::quitar_medico(int)':
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*'
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*'
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_especialidades(std::ostream&) const':
centro_medico.cpp:123: error: ‘strcmpi' was not declared in this scope
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_horarios_consulta(char*) const':
centro_medico.cpp:162: error: ‘strcmpi' was not declared in this scope
centro_medico.cpp: In member function ‘void Centro_medico::crea_medicos()':
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*'
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*'


medico.cpp

medico.cpp

#include "medico.h"
#include <cstdlib>
#include <iostream>
#include <stdlib>  
#include<cstring>
#include<string>

long Medico::total_consultas=0; 
Medico::Medico(char *nom,char * espe,int colegiado,int trabajo)
{
int i;
strcpy(nombre,nom);
strcpy(especialidad,espe);
num_colegiado=colegiado;
num_horas_diarias=trabajo;
citas_medico= new Cita*[5]; // 5 Días de las semana, de Lunes a Viernes.
for (i=0;i<5;i++)
citas_medico[i]=new Cita[num_horas_diarias];
}



Medico::Medico(const Medico &m){
  int i;
  citas_medico=new Cita*[5];
  for (i=0;i<5;i++)
   citas_medico[i]=NULL;
 (*this) = m;
}

Medico &Medico::operator=(const Medico &m){
 int i,j;
 if (this != &m) { // Para evitar la asignación de un objeto a sí mismo
     strcpy(nombre,m.nombre);
     strcpy(especialidad,m.especialidad);     
     num_colegiado=m.num_colegiado;
     num_horas_diarias=m.num_horas_diarias;
     for (i=0;i<5;i++){
      delete citas_medico[i]; 
      citas_medico[i]=new Cita[num_horas_diarias];
      for(j=0;j<num_horas_diarias;j++){
       citas_medico[i][j] = m.citas_medico[i][j] ;
       }
     }     
  }
 return *this;
}


medico.h

medico.h

#pragma once
#include <cstdlib>
#include <iostream>
using namespace std;
#include "cita.h"

class Medico
{
 private:
                char nombre[50];
                char especialidad[50];
                int num_colegiado;
                int num_horas_diarias;
                Cita **citas_medico;
                static long total_consultas;                
 public:
                void mostrar_calendario_citas(ostream &o=cout) const;
                bool asignar_cita(int d, int hor,Paciente *p=NULL);
                void anular_cita(int d, int hor);
                bool consultar_cita(char dni[10], int modificar=0);
                void modificar_cita(int d, int hor);                
                void vaciar_calendario_citas();
                void borrar_calendario_citas();                
                char* get_especialidad(char espec[50]) const;
                char* get_nombre(char n[50]) const;
                int get_num_colegiado() const;
                int get_num_horas() const;
                void set_num_horas(int horas);
                void mostrar_info(ostream &o=cout) const;
                static long get_total_consultas();
                Cita* operator[](int dia);
                void eliminar_calendario_citas();
                void crear_calendario_citas();    
                Medico(char *nom,char * espe,int colegiado,int trabajo);
                Medico(const Medico &m);
                Medico &operator=(const Medico &c);
                void operator delete(void*);
                ~Medico();
 };
 ostream& operator<<(ostream &o, Medico &c);
 ofstream& operator<<(ofstream &fichero, Medico &m);
 ifstream& operator>>(ifstream &fichero, Medico &m);

回答by DevSolar

Observations:

观察:

  • #include <cstring>should introduce std::strcpy().
  • using namespace std;(as written in medico.h) introduces any identifiers from std::into the global namespace.
  • #include <cstring>应该引入 std::strcpy()。
  • using namespace std;(如 medico.h 中所写)将来自std::全局命名空间的任何标识符引入。

Aside from using namespace std;being somewhat clumsy once the application grows larger (as it introduces one hell of a lot of identifiers into the global namespace), and that you should neveruse usingin a header file (see below!), using namespacedoes not affect identifiers introduced afterthe statement.

除了using namespace std;是有些笨拙,一旦应用程序变得更大(因为它引入了大量的标识符之一地狱到全局命名空间),并且你应该永远使用using头文件(见下文!),using namespace并不会影响推出标识符的陈述。

(using namespace stdis written in the header, which is included in medico.cpp, but #include <cstring>comes afterthat.)

using namespace std被写入头,它包括在medico.cpp,但#include <cstring>附带这一点。)

My advice:Put the using namespace std;into medico.cpp, after any includes, and use explicit std::in medico.h.

我的建议:using namespace std;放入 medico.cpp,在任何包含之后,并std::在 medico.h 中使用显式。



strcmpi()is not a standard function at all; while being defined on Windows, you have to solve case-insensitive compares differently on Linux.

strcmpi()根本不是标准功能;在 Windows 上定义时,您必须在 Linux 上以不同的方式解决不区分大小写的比较。

(On general terms, I would like to point to this answerwith regards to "proper" string handling in C and C++ that takes Unicode into account, as every application should. Summary: The standard cannothandle these things correctly; douse ICU.)

(一般来说,我想指出这个关于在 C 和 C++ 中考虑 Unicode 的“正确”字符串处理的答案,因为每个应用程序都应该考虑。总结:标准无法正确处理这些事情;使用ICU。 )



warning: deprecated conversion from string constant to ‘char*'

A "string constant" is when you write a string literal (e.g. "Hello") in your code. Its type is const char[], i.e. array of constantcharacters (as you cannot change the characters). You can assign an array to a pointer, but assigning to char *, i.e. removing the constqualifier, generates the warning you are seeing.

“字符串常量”是指您"Hello"在代码中编写字符串文字(例如)。它的类型是const char[],即常量字符数组(因为您不能更改字符)。您可以将数组分配给指针,但分配给char *,即删除const限定符,会生成您看到的警告。



OT clarification: usingin a header file changes visibility of identifiers for anyone including that header, which is usually not what the user of your header file wants. For example, I could use std::stringand a self-written ::stringjust perfectly in my code, unless I include your medico.h, because then the two classes will clash.

OT 澄清:using在头文件中更改包括该头在内的任何人的标识符的可见性,这通常不是头文件的用户想要的。例如,我可以在我的代码中完美地使用std::string和自我编写::string除非我包含您的 medico.h否则这两个类会发生冲突。

Don't use usingin header files.

不要using在头文件中使用。

回答by Chak

When you say:

当你说:

 #include <cstring>

the g++ compiler should put the <string.h>declarations it itself includes into the std::AND the global namespaces. It looks for some reason as if it is not doing that. Try replacing one instance of strcpywith std::strcpyand see if that fixes the problem.

g++ 编译器应该将<string.h>它自己包含的声明放入std::AND 全局命名空间中。它看起来出于某种原因,好像它没有这样做。尝试替换strcpywith 的一个实例,std::strcpy看看是否能解决问题。

回答by MRS1367

This error sometimes occurs in a situation like this:

在这样的情况下有时会发生此错误:

#ifndef NAN
#include <stdlib.h>
#define NAN (strtod("NAN",NULL))
#endif

static void init_random(uint32_t initseed=0)
{
    if (initseed==0)
    {
        struct timeval tv;
        gettimeofday(&tv, NULL);
        seed=(uint32_t) (4223517*getpid()*tv.tv_sec*tv.tv_usec);
    }
    else
        seed=initseed;
#if !defined(CYGWIN) && !defined(__INTERIX)
    //seed=42
    //SG_SPRINT("initializing random number generator with %d (seed size %d)\n", seed, RNG_SEED_SIZE)
    initstate(seed, CMath::rand_state, RNG_SEED_SIZE);
#endif
}

If the following code lines not run in the run-time:

如果以下代码行未在运行时运行:

#ifndef NAN
#include <stdlib.h>
#define NAN (strtod("NAN",NULL))
#endif

you will face with an error in your code like something as follows; because initstateis placed in the stdlib.hfile and it's not included:

您将在代码中遇到如下错误;因为initstate被放置在stdlib.h文件中并且它不包括在内

In file included from ../../shogun/features/SubsetStack.h:14:0, 
                 from ../../shogun/features/Features.h:21, 
                 from ../../shogun/ui/SGInterface.h:7, 
                 from MatlabInterface.h:15, 
                 from matlabInterface.cpp:7: 
../../shogun/mathematics/Math.h: In static member function 'static void shogun::CMath::init_random(uint32_t)': 
../../shogun/mathematics/Math.h:459:52: error: 'initstate' was not declared in this scope