2012-02-23 30 views
7

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?

+1

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'.) –

+0

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

+1

@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). –

Respuesta

1

Dado que ninguna de las personas en los comentarios tomó la oferta para convertir sus comentarios en una respuesta que estoy obligado a responder a mi propia pregunta.

Bueno, básicamente, una respuesta posible sería que, como afirma AI, no existe una convención de nomenclatura específica. Por supuesto método de nomenclatura se utiliza, debe ser:

  • Consistente través de todo el proyecto/s para mayor claridad
  • reconocible por otros programadores como una función que hace lo que está haciendo en realidad .

Para lograr eso, hubo algunas excelentes recomendaciones en los comentarios.Para cuando un objeto foo es:

  • pasó para inicialización dentro de la función: foo_init
  • Asignado dentro de la función y un puntero devueltos: foo_alloc, foo_make, foo_new

Todo lo anterior está claro, supongo, pero lo que describe con mayor precisión es lo que está sucediendo en las funciones sería foo_init y foo_alloc.

Personalmente, no me gusta la solución _alloc porque no me gusta cómo se ve en mi código, así que decidí agregar el verbo _create en lugar de alloc después de la función para indicar lo que está haciendo.

Pero bueno, la respuesta se reduce a Supongo que es una preferencia personal. Todo debería estar bien y ser aceptable siempre que la funcionalidad de la función quede clara al leer su nombre.

2

No estoy seguro de si hay algún bien nomenclatura definida por los dos métodos,
En el primer método la función asigna dinámicamente una estructura y asigna valores a los miembros,
mientras que en segundos la estructura se asigna antes de la función y la función simplemente asigna valores a los miembros.

¿Determina el uso del objeto que está haciendo y determina si debe tener una función de inicialización de tipo 1, o 2 o incluso ambos?

Selección de primer o segundo método depende de una diferencia importante:
se prefiere el primer método cuando se necesita para pasar a la estructura devuelta a través de ámbitos, la memoria en el montón tiene que ser liberado de forma explícita hasta el cual los datos prevalece mientras en el segundo método, los datos en la pila se eliminan una vez que el alcance del objeto pasado termina.

+0

Hola, gracias por la respuesta. Sé la diferencia entre los dos métodos diferentes, así que mi pregunta es si, por ejemplo, ... necesitas hacer las dos cosas que dices en el último párrafo. ¿Tendrías ambas funciones de inicialización y usarías cada una cuando sea apropiado? Además, como no soy un hablante de inglés nativo, ¿puede darme un término para nombrar la segunda función?Esta es la razón principal por la que hice la pregunta, porque quería nombrar las funciones en mi base de código – Lefteris