Sin embargo, otra pregunta static
. He leído la siguiente:palabra clave estática en el archivo h y vinculación interna
- What are static variables?
- file scope and static floats
- http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx
Y todavía no comprender el siguiente comportamiento: tengo una h
archivo:
// StaticTest.h
#include <stdio.h>
static int counter = 0;
struct A {
A() {
counter++;
printf("In A's ctor(%d)\n", counter);
}
~A() {
counter--;
printf("In A's dtor(%d)\n", counter);
}
};
static A a;
Y dos cpp
archivos:
// StaticTest1.cpp
#include "StaticTest.h"
int main() {
return 0;
}
Y:
// StaticTest2.cpp
#include "StaticTest.h"
La salida del programa es:
In A's ctor(1)
In A's ctor(2)
In A's dtor(1)
In A's dtor(0)
Ahora, el constructor A
's se llama dos veces, ya que el h
el archivo se incluye dos veces, y desde la instancia A
llamada a
se declara static
, tiene un enlace interno y el compilador está contento. Dado que el counter
también se declara estático, también tiene un enlace interno, y esperaría que su valor no se comparta en los dos archivos cpp
--- pero el resultado del programa implica que el valor es compartido, ya que cuenta hasta 2
alguna idea?
EDIT: Cualquier respuesta con respecto a lo que se considera un "buen hábito de programación" en el contexto de la declaración de variables estáticas en h
vs cpp
archivos también se da la bienvenida.
I * * quiero decir algo acerca de los detalles de implementación y alrededor de tiempo de compilación-inicializado valores estáticos frente a los valores estáticos de tiempo de ejecución-inicializado, pero no me siento seguro de publicarlo como una respuesta. Intenta dejar 'counter' sin inicializar e inicializándolo en' main() '. –
@ Benoit Thiery: este es el código fuente completo. –
@ Ignacio Vazquez-Abrams: de la página de MSDN: "Cuando declaras una variable, la variable tiene una duración estática y el compilador la inicializa a 0 a menos que especifiques otro valor" –