2010-04-23 3 views
3

Как работает следующее:Определения членов STL Static-Const

#include <limits> 

int main() 
{ 
    const int* const foo = &std::numeric_limits<int> ::digits; 
} 

Я был под впечатлением, что для того, чтобы принять адрес static const -ant члена, мы должны были физически определить его в какой-то единице перевода, чтобы угодить линкер. Тем не менее, посмотрев на предварительно обработанный код для этого TU, я не смог найти внешнее определение для члена digits (или любых других соответствующих членов).

Я тестировал это на двух компиляторах (VC++ 10 и g ++ 4.2.4) и получил одинаковые результаты от обоих (то есть, он работает). Связан ли компоновщик автоматически с магическим связыванием с объектным файлом, где этот материал определен, или я пропущу что-то очевидное здесь?

ответ

2

Ну, что заставляет вас думать, что это не определено? Самым фактом, что ваша попытка выполнить адрес успешно, автоматически указывает, что он - это. Разумеется, не обязательно находиться в вашем блоке трансакций, поэтому просмотр результатов препроцессора не имеет большого смысла.

+0

Ну, две вещи: 1) Я думал, что заголовок пределов может привести его к моему модулю перевода. Кажется, не так. 2) Я посмотрел на командную строку компоновщика VS и не смог найти какие-либо «чужие» объектные файлы, неявно заданные. – javery

+1

@javery: Foreign? Почему иностранный? Определение должно быть частью стандартной библиотеки. Вы * * со ссылкой на стандартную библиотеку, не так ли? – AnT

+0

От «foreign» я имел в виду иностранные свои файлы; который включает стандартную библиотеку. Извините за путаницу. :) – javery

Смежные вопросы