2010-12-15 128 views

Répondre

9

Eh oui, vous pouvez utiliser __LINE__. En outre, __FILE__.

See Keywords section

Comme BCS et Jonathan M Davis soulignez dans les commentaires, il y a un cas particulier pour __LINE__ et amis: quand il est utilisé comme valeur par défaut d'un argument ou une fonction modèle, ils décident de l'emplacement de l'appelant, pas la signature du modèle ou de la fonction. C'est génial pour sauver les appelants de devoir fournir cette information.

void myAssert(T)(lazy T expression, string file = __FILE__, int line = __LINE__) 
{ 
    if (!expression) 
    { 
      // Write the caller location 
      writefln("Assert failure at %s:%s", file, line); 
    } 
} 
+0

Parfait, merci. Je savais qu'ils ne devaient pas aller changer tous les numéros de ligne dans les lignes d'exception quand ils ont modifié un fichier std lib :) –

+6

FWIW: '__LINE__' est pas exactement les mêmes que dans C. Il y a au moins un cas d'angle où c'est différent: s'il est utilisé comme valeur par défaut pour un argument, il se résout à la ligne qui fait l'appel et non à la ligne où la fonction est définie. – BCS

+5

Ce qui est * vraiment * utile lors de la création de fonctions de test où vous voulez que les échecs signalent la ligne de l'appel plutôt que dans la fonction de test. –