selectany

Блок, относящийся только к системам Microsoft

Сообщает компилятору, что объявленный элемент глобальных данных (переменная или объект) является универсальным COMDAT (упакованной функцией).

__declspec( selectany ) declarator

Заметки

Во время компоновки, если отображается несколько определений COMDAT, компоновщик выбирает один из них и игнорирует остальные. При выборе параметра компоновщика /OPT: REF (оптимизации) произойдет исключение COMDAT для удаления всех элементов данных без ссылок во выходных данных компоновщика.

Конструкторы и назначение с помощью глобальной функции или статических методов в объявлении не создадут ссылку и не предотвратят исключение /OPT:REF. Побочные эффекты такого кода не должны быть зависимыми, если не существует других ссылок на данные.

Для динамически инициализированных глобальных объектов selectany также удалит код инициализации объекта без ссылки.

Обычно элемент глобальных данных можно инициализировать только один раз в проекте EXE или DLL. selectany можно использовать при инициализации глобальных данных, определенных в заголовках, если одинаковый заголовок отображается в нескольких исходных файлах. selectany доступен в обоих компиляторах: C и C++.

Примечание

selectany можно применить только к существующей инициализации элементов глобальных данных, видимых извне.

Пример

В следующем коде демонстрируется использование атрибута 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);

В этом примере кода показано, как использовать атрибут selectany, чтобы включить свертывание записей COMDAT при использовании параметра компоновщика /OPT:ICF. Обратите внимание, что данные должны быть отмечены selectany и внесены в раздел const (только для чтения). Раздел, доступный только для чтения, необходимо указать явно.

// 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;
}

Завершение блока, относящегося только к системам Microsoft

См. также

Ссылки

__declspec

Ключевые слова в C++