selectany
Específicos de Microsoft
Indica al compilador que el elemento de datos global declarado (variable u objeto) es un selección-cualquier COMDAT (una función empaquetada).
__declspec( selectany ) declarator
Comentarios
En tiempo de vínculo, si varias definiciones de un COMDAT se consideran, el vinculador elige uno y descarta el resto.Si la opción del vinculador /OPT: referencia (optimizaciones) está seleccionado, la eliminación de COMDAT aparecerá para quitar todos los elementos de datos que en la salida del vinculador.
Los constructores y asignación de la función o métodos estáticos globales en la declaración no crean una referencia y no impedirá /OPT: eliminación de la referencia.Los efectos secundarios de este código no deben ser dependidos de cuando no existe ninguna otras referencias a los datos.
Para inicializar dinámicamente, los objetos globales, selectany descartarán el código de inicialización de un objeto sin referencia, también.
Un elemento de datos global se puede inicializar normalmente solo una vez en un proyecto EXE o DLL.selectany se puede utilizar en los datos globales que se inicializan definido por los encabezados, cuando el mismo encabezado aparece en más de un archivo de código fuente.selectany está disponible en los compiladores de c y C++.
[!NOTA]
selectany sólo se puede aplicar a la inicialización real de los elementos de datos globales que están visibles externamente.
Ejemplo
este código muestra cómo utilizar el atributo de selectany :
//Correct - x1 is initialized and externally visible
__declspec(selectany) int x1=1;
//Incorrect - const is by default static in C++, so
//x2 is not visible externally (This is OK in C, since
//const is not by default static in C)
const __declspec(selectany) int x2 =2;
//Correct - x3 is extern const, so externally visible
extern const __declspec(selectany) int x3=3;
//Correct - x4 is extern const, so it is externally visible
extern const int x4;
const __declspec(selectany) int x4=4;
//Incorrect - __declspec(selectany) is applied to the uninitialized
//declaration of x5
extern __declspec(selectany) int x5;
// OK: dynamic initialization of global object
class X {
public:
X(int i){i++;};
int i;
};
__declspec(selectany) X x(1);
Este código muestra cómo utilizar el atributo de selectany para garantizar el plegamiento de datos COMDAT cuando también utiliza la opción del vinculador /OPT: ICF .Observe que los datos se deben marcar con selectany y colocar en una sección de const (solo lectura).Debe especificar explícitamente la sección de solo lectura.
// selectany2.cpp
// in the following lines, const marks the variables as read only
__declspec(selectany) extern const int ix = 5;
__declspec(selectany) extern const int jx = 5;
int main() {
int ij;
ij = ix + jx;
}
Específico de Microsoft de FINAL