2010-10-27 7 views
0

Est-il possible de déterminer le numéro de ligne qui appelle une fonction sans l'aide d'une macro?Détermination de la ligne appelante sans macro

Tenir compte de ce code:

#include <iostream> 

#define PrintLineWithMacro() \ 
    std::cout << "Line: " << __LINE__ << std::endl; // Line 4 

void PrintLine() 
{ 
    std::cout << "Line: " << __LINE__ << std::endl; // Line 8 
} 

int main(int argc, char **argv) 
{ 
    PrintLine();   // Line 13 
    PrintLineWithMacro(); // Line 14 
    return 0; 
} 

qui produit les éléments suivants:

Line: 8 
Line: 14 

Je comprends pourquoi chaque imprime ce qu'ils font. Je suis plus intéressé s'il est possible d'imiter la fonction macro sans utiliser de macro.

+3

La seule façon d'obtenir la ligne est avec '__LINE__'; vous devez utiliser le préprocesseur quelque part. (En d'autres termes, le préprocesseur traite le code * brut *, et les numéros de ligne font partie du code * brut *.) – GManNickG

Répondre

5

je ferais ce qui suit:

#define PrintLine() PrintLine_(__LINE__) 

void PrintLine_(int line) { 
    std::cout << "Line: " << line << std::endl; 
} 

Je sais que cela ne supprime pas complètement le préprocesseur, mais il ne bouge plus de la logique en une fonction réelle.

+3

Ceci est une solution de contournement décente, car vous devez utiliser une macro. Toutefois, vous devez explicitement qualifier l'appel de fonction dans la macro (:: PrintLine_, ou dans l'espace de noms dans lequel il se trouve) et utiliser des parenthèses. –

1

Non portable. Sur une plate-forme donnée, vous pouvez fondamentalement ré-implémenter les détails d'un débogueur - l'information est effectivement stockée sur votre pile comme adresse de retour. Vous pouvez obtenir ce genre de chose avec la fonction backtrace() sur certaines plates-formes.

Questions connexes