selectany
Específicos do Microsoft
Informa o compilador que o item de dados global declarado (objeto ou variável) é uma escolha qualquer COMDAT (uma função de pacote).
__declspec( selectany ) declarator
Comentários
No momento de link, se várias definições de um COMDAT são vistas, o vinculador escolhe uma e descarta o resto.Se a opção de vinculador /OPT: ref (otimizações) estiver selecionada, a eliminação de COMDAT ocorrerá para remover todos os itens de dados não consultados na saída do vinculador.
Construtores e atribuição de função global ou métodos estáticos na declaração não criam uma referência e não impedirá a eliminação de /OPT: ref.Efeitos colaterais de tal código não deve dependia quando não existe nenhuma outra referência aos dados.
Para objetos dinamicamente inicializados, globais, selectany descartará o código de inicialização do objeto não referenciado, também.
Um item de dados global normalmente pode ser inicializado somente uma vez em um projeto EXE ou DLL.selectanypode ser usado ao inicializar dados globais definida por cabeçalhos, quando o mesmo cabeçalho aparece em mais de um arquivo de origem.selectanyestá disponível em compiladores de c e C++.
Observação |
---|
selectanysó pode ser aplicado para a inicialização real de itens de dados globais que são visíveis externamente. |
Exemplo
Este código mostra como usar o selectany atributo:
//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 mostra como usar o selectany atributo para garantir a dobra de COMDAT dados ao usar também o /OPT: ICF opção de vinculador.Observe que os dados devem ser marcados com selectany e colocado em um const seção (somente leitura).Você deve especificar explicitamente a seção somente leitura.
// 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íficos do Microsoft final