2012-07-02 23 views
6

poco leí Stroustrups El C++ Programming Language y en la sección acerca de ligamiento en el capítulo 9 me encontré con el siguiente párrafo:¿Por qué deberíamos usar solo 'estático' dentro de una clase o una función (C++)?

"En C y los programas más antiguos de C++, la palabra clave estática es (confusamente) Usó para significar "usar enlace interno". No use estático excepto las funciones internas y las clases. "

El problema es que leyendo más adelante, el autor no explicó por qué esta es una mala práctica. De vez en cuando utilizo funciones estáticas en mi código para algunos cálculos simples que no son necesarios fuera de la unidad de compilación, pero nunca me di cuenta de que esto estaba mal visto y no es obvio para mí por qué es malo. ¿Alguien puede arrojar luz sobre esto para mí, por favor?

+2

Al propietario de close-vote: ¿cómo es esto no constructivo? –

+0

tal vez esto sea de alguna ayuda http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c –

Respuesta

5

Creo que la idea es no fruncir el ceño a la vinculación interna, pero para evitar confusiones con el nuevo significado de static: static tiene demasiados significados (declarar cosas con enlaces internos, definir variables locales con duración de almacenamiento estática, marcar miembros de clases no instancia), por lo que evitar una de las menos intuitivas es algo bueno.

Debido a esto, el estándar C++ 98 proporciona otra forma de declarar elementos con enlace interno: unnamed namespaces, y desaprueba static "al declarar objetos en un ámbito de espacio de nombre".

El estándar C++ 11 eliminó esta obsolescencia (y también cambió de algún modo la semántica de los espacios de nombre no nombrados, que en realidad no requieren vinculación interna), por lo que ahora es realmente una cuestión de estilo.

+3

Los espacios de nombres sin nombre no _hacen_ que sus contenidos tengan un enlace interno. Lo colocan en un espacio de nombres que no se puede nombrar fuera de la unidad de traducción, pero el enlace sigue siendo externo, lo que hace una diferencia para las plantillas. –

+0

@JamesKanze: ¿Todavía hace una diferencia para las plantillas o se refiere al lenguaje anterior a 2011? –

+0

@JamesKanze: ¿qué diferencia hace para las plantillas? –

4

Porque en C++ deben preferirse los espacios de nombres anónimos, que básicamente ofrecen la misma funcionalidad.

Creo static en este contexto es mal visto debido a los dobles sentidos, y el hecho de que los dos significados son bastante contrario - si dentro de un class o una struct que representa un estado global, mientras que fuera de él da linkeage interna y proporciona una copia de una variable o método a cada unidad de traducción.

Moreso, static solo se puede aplicar a funciones y variables, mientras que dentro de un espacio de nombre anónimo puede tener declaraciones de tipo.

namespace //OK 
{ 
    class X {}; 
} 

static class X //syntactically correct, but does nothing 
{ 
}; 

Tenga en cuenta que la norma considera el uso de static para especificar linkeage como obsoleta.

+0

También existe el hecho de que no se pueden usar objetos 'static' o funciones para crear una instancia de una plantilla. (Y existe el hecho un tanto contradictorio de que una variable 'const' en el ámbito del espacio de nombres es' estática' por defecto.) –

+1

C++ 11 eliminó la depreciación y también la restricción tonta en los argumentos de la plantilla. Ya no hay ninguna razón en particular para preferir uno sobre el otro. –

Cuestiones relacionadas