2010-04-23 7 views
3

Comment fonctionne ce qui suit?STL Static-Const Membre Définitions

#include <limits> 

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

J'avais l'impression que pour prendre une adresse d'un membre static const -ant nous devions définir physiquement dans une unité de traduction afin de plaire à l'éditeur de liens. Cela dit, après avoir examiné le code prétraité pour cette UT, je n'ai pas pu trouver de définition externe pour le membre digits (ou tout autre membre pertinent).

J'ai testé ceci sur deux compilateurs (VC++ 10 et g ++ 4.2.4) et obtenu des résultats identiques à la fois (c'est-à-dire, cela fonctionne). Est-ce que l'éditeur de liens est automatiquement lié à un fichier objet où ce contenu est défini, ou est-ce que quelque chose me manque ici?

Répondre

2

Eh bien, qu'est-ce qui vous fait penser que c'est pas défini? Le fait même que votre tentative pour prendre l'adresse a réussi automatiquement indique que est défini quelque part. Bien sûr, il n'est pas nécessaire de résider dans votre unité de transfert, donc regarder à travers la sortie du préprocesseur n'a pas beaucoup de sens.

+0

Eh bien, deux choses: 1) Je pensais que l'en-tête des limites pourrait l'amener dans mon unité de traduction. Cela ne semble pas être le cas. 2) J'ai regardé la ligne de commande de l'éditeur de liens de VS et je n'ai trouvé aucun fichier objet "étranger" implicitement spécifié. – javery

+1

@javery: Étranger? Pourquoi étranger? La définition doit faire partie de la bibliothèque standard. Vous * êtes * lié à la bibliothèque standard, n'est-ce pas? – AnT

+0

Par "étranger" je voulais dire étranger à mes propres fichiers; Cela inclut la bibliothèque standard. Désolé pour la confusion. :) – javery