Esta será una pregunta fácil, pero buscar en Google no parece darme una respuesta. Tal como lo entiendo en C, tenemos dos formas de inicializar un objeto foo, cuando foo es una estructura. Mira el siguiente código para un ejemploTerminología al inicializar estructuras en C
typedef struct foo
{
int var1;
int var2;
char* var3;
}foo;
//initializes and allocates a foo
foo* foo_init1(int v1,int v2,const char* v3)
{
if(..some checks..)
return 0;
foo* ret = malloc(sizeof(foo));
ret->var1 = v1;
ret->var2 = v2;
ret-var3 = malloc(strlen(v3)+1);
strcpy(ret->var3,v3);
return ret;
}
// initializes foo by ... what? How do we call this method of initialization?
char foo_init2(foo* ret,int v1,int v2, const char* v3)
{
//do some checks and return false
if(...some checks..)
return false//;assume you defined true and false in a header file as 1 and 0 respectively
ret->var1 = v1;
ret->var1 = v1;
ret->var2 = v2;
ret-var3 = malloc(strlen(v3)+1);
strcpy(ret->var3,v3);
return true;
}
Así que mi pregunta es esta. ¿Cómo nos referimos en C a estos diferentes métodos de inicialización? El primero devuelve un puntero inicializado a foo por lo que es fácil de usar si se desea un objeto foo en el montón así:
foo* f1 = foo_init1(10,20,"hello");
Pero la segunda requiere un foo .. qué? Mira el código a continuación.
foo f1;
foo_init2(&f1,10,20,"hello");
Así que el segundo método hace que sea fácil para inicializar un objeto en la pila, pero ¿cómo se llaman? Esta es básicamente mi pregunta, cómo hacer referencia al segundo método de inicialización.
El primero asigna e inicializa un puntero a foo. El segundo inicializa un foo por ... ¿qué? ¿Referencia?
Como una pregunta de bonificación, ¿cómo trabajan ustedes al codificar en C? ¿Determina el uso del objeto que está haciendo y con eso determina si debería tener una función de inicialización de tipo 1, o 2 o incluso ambos?
Me gusta llamarlos '_new' para el que asigna y' _init' para el que no. Además, haga que '_new' llame a' _init' internamente para hacer que su código sea más fácil de mantener. (A veces lo llamo '_make' en lugar de' _new'.) –
Hola, Chris, una buena idea de cómo los llamas. ¿Por qué no hace de esto una respuesta para poder votar y también para los posibles usuarios de SO que tienen la misma pregunta? Además ... ¿no hay una forma estándar para que las personas se refieran a ellos? Quiero que alguien mire mi código (ya que es una API) para comprender inmediatamente el uso diferente solo por el nombre de la función – Lefteris
@ChrisLutz: para ser claros, añades '_new',' _init' al nombre del tipo, a la derecha (' foo_new', 'foo_init')? De lo contrario, estarías colisionando con los identificadores que están reservados para la implementación. (Estoy seguro de que usted sabe esto, otros podrían no). –