Si desea variables privadas en c, hay una serie de técnicas que pueden aproximar una variable privada, pero el lenguaje C en realidad no tiene un concepto de "protección" que se extiende a privado, público, protegido (como C++ hace).
C mostrará el nombre de cualquier variable (que es un requisito en C) por lo que debe acercarse a él con la idea de ocultación de la información del tipo de la variable (toma de eliminación de referencias bastante difícil).
Un truco es definen la variable como un void*
con el tipo de variable real que es conocido sólo en una .c
módulo.
/* somefile.h */
extern void* counter;
/* somefile.c */
#include "somefile.h"
int actualCounter = 0;
void* counter = &actualCounter;
/* otherfile.c */
#include "somefile.h"
// we can see "counter", but we cannot "use" it here; because we don't have access
// to the real "hidden" type of "int".
Un método mejor es extender esta idea usando la palabra clave struct
, y hacer pseudo-métodos, al igual que
/* person.h */
struct s_person;
typedef Person struct s_person;
Person* new_Person(char* name);
void delete_Person(Person* person);
void Person_setName(Person* person, char* name);
char* Person_getName(Person* person);
/* person.c */
struct s_person {
char* name;
};
Person* new_Person(char* name) {
Person* object = (Person*)malloc(sizeof(struct s_person));
// duplicate the string for more security, otherwise constructor
// could manipulate the "private" string after construction.
object->name = strdup(name);
return object;
}
void delete_Person(Person* person) {
// some implementations pass a Person** to set the reference to 0
// this implementation requires that the caller sets his own references to 0
free(person->name);
free(person);
}
void Person_setName(Person* person, char* name) {
// free the old
free(person->name);
// duplicate the new to provide "out of simulated class" modification by malicious
// name setter.
person->name = strdup(name);
}
char* Person_getName(Person* person) {
// must return a copy, otherwise one can manipulate name
// from reference provided by Person_getName(...);
return strdup(person->name);
}
/* otherfile.c */
#include "Person.h"
/* Now we can hold Person "simulated objects", but we cannot */
/* manipulate their "state" without using the C simulated object */
/* methods */
int main(int argc, char** argv) {
Person* bob = new_Person("bob");
printf("%s\n", Person_getName(bob));
delete_Person(bob);
// critical or we hold a pointer to freed memory.
bob = 0;
return 0;
}
Técnicas de este tipo tienen varias variantes, uno es tener una "estructura pública "con un puntero void * a la" estructura privada ". Uno es incluir los "métodos" como indicadores de función en la "estructura pública" (un paso hacia el polimorfismo de soporte), uno es escribir un sistema tipo C++ completo y adecuado que intente resolver las cosas exactamente como lo haría C++ (jerarquías de clase, polimorfismo, unión tardía, ocultamiento de información, etc.).
Básicamente, se puede conseguir un poco de "objeto-orientado-dad", sin demasiado trabajo, pero a medida que agrega más características de -ornamentation, se le agrega más código de unión (hasta que es mucho más sencillo de utilizar realmente una lenguaje de programación orientado a objetos).
'C' no tiene la noción de' privado'. Tal vez tratando de mirar las variables globales 'estáticas'. – RageD
Así mi pregunta. ¿Cómo puedo engañar a C? – Reid
Depende de lo que estés tratando de hacer. Como 'C' no es OOP (está orientado a funciones), tendrá que trabajar con funciones y' struct's o variables globales. – RageD