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
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
#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
#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);
To fix it, use strcpy_s which requires you to also pass a maximum number of bytes to copy (which should be the size of the destination buffer). This prevents buffer overflows. Show activity on this post. This is because you've used strcpy , and your compiler considers it a potentially unsafe function.
strcpy() in C/C++ In C language,it is declared in “string. h” header file while in C++ language, it is declared in cstring header file. It returns the pointer to the destination.
The prototype of strcpy() as defined in the cstring header file is: char* strcpy(char* dest, const char* src); The strcpy() function copies the C-string pointed to by src to the memory location pointed to by dest . The null terminating character '\0' is also copied.
Observations:
#include <cstring>
should introduce std::strcpy().using namespace std;
(as written in medico.h) introduces any identifiers from std::
into the global namespace.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 never use using
in a header file (see below!), using namespace
does not affect identifiers introduced after the statement.
(using namespace std
is written in the header, which is included in medico.cpp, but #include <cstring>
comes after that.)
My advice: Put the using namespace std;
(if you insist on using it at all) into medico.cpp, after any includes, and use explicit std::
in 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.
(On general terms, I would like to point to this answer with regards to "proper" string handling in C and C++ that takes Unicode into account, as every application should. Summary: The standard cannot handle these things correctly; do use 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 constant characters (as you cannot change the characters). You can assign an array to a pointer, but assigning to char *
, i.e. removing the const
qualifier, generates the warning you are seeing.
OT clarification: using
in 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::string
and a self-written ::string
just perfectly in my code, unless I include your medico.h, because then the two classes will clash.
Don't use using
in header files.
And even in implementation files, it can introduce lots of ambiguity. There is a case to be made to use explicit namespacing in implementation files as well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With