Pregunta

Un estilo de codificación de la presentación a la que asistí recientemente en la oficina de abogó por que las variables NO debe ser asignado (a un valor predeterminado) cuando se definen.En lugar de ello, se debe asignar un valor predeterminado justo antes de su uso.Así, algo como

int a = 0;

debe ser mal visto.

Obviamente, un ejemplo de 'int' es simplista, pero la misma de la siguiente manera para los otros tipos también como punteros, etc.

Además, también se mencionó que la C99 compatible compiladores ahora lanza una advertencia en el caso mencionado anteriormente.

El enfoque anterior parece útil para mí sólo de las estructuras, es decir,usted memset ellos sólo antes de su uso.Este sería eficaz si se utiliza una estructura (o relleno) sólo en un error de la pierna.

Para todos los demás casos, me parece la definición y la asignación de un valor predeterminado de un ejercicio prudente como me he encontrado con un montón de bugs porque de onu-inicializa los punteros tanto en la escritura y mantenimiento de código.Además, creo que C++ a través de constructores también aboga por el mismo enfoque, es decir,definir y asignar.

Me pregunto por qué(si) estándar C99 no como la definición y designación.Es su considerables de mérito en hacer lo que el estilo de codificación presentación defendido?

¿Fue útil?

Solución

Por lo general, yo recomendaría la inicialización de las variables cuando se define si el valor que debe tener es conocido, y de salir de las variables no inicializado si el valor no.De cualquier manera, los puso tan cerca de su uso como ámbito reglas lo permiten.

En lugar de ello, se debe asignar un valor predeterminado justo antes de su uso.

Por lo general, usted no debe usar un valor por defecto a todos.En C99 puede mezclar código y declaraciones, así que no hay punto de definición de la variable antes de asignar un valor a la misma.Si usted sabe el valor que supone que tomar, entonces no tiene ningún sentido tener un valor predeterminado.

Además, también se mencionó que la C99 compatible compiladores ahora lanza una advertencia en el caso mencionado anteriormente.

No para el caso de show - usted no recibe una advertencia por haber int x = 0;.Tengo la fuerte sospecha de que alguien se esta mezclado.Los compiladores de advertir si se utiliza una variable sin asignar un valor a la misma, y si usted tiene:

... some code ...

int x;

if ( a )
    x = 1;
else if ( b )
    x = 2;
// oops, forgot the last case else x = 3;

return x * y;

a continuación, aparecerá una advertencia de que x puede ser utilizado sin ser inicializada, al menos con gcc.

Usted no recibirá una advertencia si se asigna un valor a x antes de la if, pero es irrelevante si la asignación se realiza como un initialiser o como una declaración por separado.

A menos que tenga una razón en particular para asignar el valor doble para dos de las ramas, no hay punto de asignar el valor predeterminado para x en primer lugar, como se detiene el compilador avisa de que has cubierto todas las ramas.

Otros consejos

Hay no tal requisito (o incluso pauta que yo sepa) en C99, ni el compilador le advertirá sobre ella. Es simplemente una cuestión de estilo.

En lo que se refiere al estilo de codificación, creo que tomó las cosas demasiado literalmente. Por ejemplo, su afirmación es correcta en el siguiente caso ...

int i = 0;

for (; i < n; i++)
        do_something(i);

... o incluso en ...

int i = 1;

[some code follows here]

while (i < a)
        do_something(i);

... pero hay otros casos que, en mi opinión, se manejan mejor con una temprana "declarar y asignar". Considere estructuras construidas en la pila o varios OOP construcciones, como en:

struct foo {
        int bar;

        void *private;
};

int my_callback(struct foo *foo)
{
        struct my_struct *my_struct = foo->private;

        [do something with my_struct]

        return 0;
}

O como en (C99 inicializadores struct):

void do_something(int a, int b, int c)
{
        struct foo foo = {
                .a        = a,
                .b        = b + 1,
                .c        = c / 2,
        };

        write_foo(&foo);
}

En cierto modo me Coincido con el consejo, aunque no estoy del todo seguro de la norma dice nada al respecto, y dudo mucho lo de las advertencias del compilador es cierto.

La cosa es que los compiladores modernos pueden y detectar el uso de variables no inicializadas. Si establece las variables a valores por defecto en la inicialización, se pierde esa detección. Y los valores por defecto pueden causar errores también; Ciertamente, en el caso de tu ejemplo, int a = 0;. ¿Quién dice que 0 es un valor adecuado para a?

En la década de 1990, el consejo hubiera sido equivocada. Hoy en día, es correcta.

Me resulta muy útil para pre-asignar algunos datos por defecto a las variables de modo que no tengo que hacer (como muchos) cheques nulos en el código.

He visto tantos errores debidos a los punteros no inicializados que siempre he abogado por declarar cada variable con NULL_PTR y cada primitivewith algún valor no válido / por defecto.

Desde que trabajo en RTOS y sistemas de alto rendimiento pero de bajo recursos, es posible que los compiladores que utilizamos no cogen el uso no inicializado. Aunque dudo compiladores modernos también se puede confiar en un 100%.

En los grandes proyectos en los que se utilizan extensivamente de Macro, he visto casos raros en los que incluso Kloclwork / Purificar no han podido encontrar no inicializado uso.

Por eso digo pega con él todo el tiempo que está utilizando el viejo y simple en C / C ++.

Las lenguas modernas como .Net pueden garantizar para inicializar varaibles, o dar un error de compilación para el uso variable no inicializada. Siguiente enlace hace un análisis de rendimiento y valida que hay un rendimiento del 10-20% para golpear a .NET. El análisis está en bastante detalle y se explica así.

http://www.codeproject.com/KB/dotnet/DontInitializeVariables.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top