Frage

Im Interesse der Debugging-Zwecke, kann ich die Zeilennummer in C / C ++ Compiler? (Standardverfahren oder bestimmte Art und Weise für bestimmte Compiler)

z

if(!Logical)
    printf("Not logical value at line number %d \n",LineNumber);
    // How to get LineNumber without writing it by my hand?(dynamic compilation)
War es hilfreich?

Lösung

Sie sollten die Präprozessormakro __LINE__ und __FILE__ verwenden. Sie sind vordefinierte Makros und einen Teil des C / C ++ Standard. Während der Vorverarbeitung werden sie jeweils durch einen konstanten String ersetzt eine ganze Zahl hält die aktuelle Zeilennummer und der aktuellen Dateinamen entspricht.

Andere Präprozessor Variablen:

  • __func__: Funktionsname (dies ist Teil der C99 nicht alle C ++ Compiler unterstützen es)
  • __DATE__: eine Reihe von Form "Mmm dd yyyy"
  • __TIME__: eine Reihe von Form "hh: mm: ss"

Ihr Code wird sein:

if(!Logical)
  printf("Not logical value at line number %d in file %s\n", __LINE__, __FILE__);

Andere Tipps

Als Teil der C ++ Standard gibt es einige vordefinierte Makros, die Sie verwenden können. Abschnitt 16.8 der C ++ Standard definiert unter anderem die __LINE__ Makro.

  

__LINE__: Die Zeilennummer der aktuellen Quellenleitung (eine Dezimalzahl   konstant).
   __FILE__: Der mutmaßliche Name der Quelldatei (eine Zeichenkette   wörtlich).
   __DATE__: Das Datum der Übersetzung der Quelldatei (eine Zeichenkette   wörtliche ...)
   __TIME__: Die Zeit der Übersetzung der Quelldatei (eine Zeichenkette   wörtliche ...)
   __STDC__: Whether__STDC__ vordefiniert
   __cplusplus: Der Name __cplusplus wird auf den Wert 199711L definiert, wenn   eine C ++ Übersetzungseinheit Kompilieren

So Ihr Code wäre:

if(!Logical)
  printf("Not logical value at line number %d \n",__LINE__);

Sie können einen Makro mit dem gleichen Verhalten verwenden, wie printf () , außer dass es enthält auch Debug-Informationen wie Funktion Name, Klasse, und die Zeilennummer:

#include <cstdio>  //needed for printf
#define print(a, args...) printf("%s(%s:%d) " a,  __func__,__FILE__, __LINE__, ##args)
#define println(a, args...) print(a "\n", ##args)

sollten Diese Makros verhalten sich genauso wie printf () , während einschließlich Java-Stacktrace-ähnliche Informationen. Hier ist ein Beispiel Haupt:

void exampleMethod() {
    println("printf() syntax: string = %s, int = %d", "foobar", 42);
}

int main(int argc, char** argv) {
    print("Before exampleMethod()...\n");
    exampleMethod();
    println("Success!");
}

Welche Ergebnisse in der folgenden Ausgabe:

  

main (main.cpp: 11) Vor ExampleMethod () ...
  ExampleMethod (main.cpp: 7) printf () Syntax: string = FooBar, int = 42
  main (main.cpp: 13) Erfolg!

Mit __LINE__ (das ist doppelt Strich LINE Doppelstrich), der Präprozessor es mit der Zeilennummer ersetzen wird, auf dem es gefunden wird.

Zur Kasse __FILE__ und __LINE__ Makros

Versuchen __FILE__ und __LINE__.
Sie könnten auch __DATE__ und __TIME__ nützlich finden.
Obwohl, wenn Sie ein Programm auf dem Clientside debuggen und damit müssen diese Informationen log sollten Sie normalen Debugging verwenden.

Da bin ich auch dieses Problem jetzt mit Blick auf, und ich kann keine Antwort auf eine andere, sondern auch gültige Frage gestellt: hier , Ich werde ein Beispiel Lösung für das Problem der zur Verfügung stellen: immer nur die Zeilennummer, wo die Funktion in C genannt wurde ++ Vorlagen.

Hintergrund: in C ++ kann ein nicht-Typ Integer-Wert als Template-Argument verwendet. Dies ist anders als die typische Verwendung von Datentypen als Vorlage Argument. So ist die Idee, solche Integer-Werte für einen Funktionsaufruf zu verwenden.

#include <iostream>

class Test{
    public:
        template<unsigned int L>
        int test(){
            std::cout << "the function has been called at line number: " << L << std::endl;
            return 0;
        }
        int test(){ return this->test<0>(); }
};

int main(int argc, char **argv){
    Test t;
    t.test();
    t.test<__LINE__>();
    return 0;
}

Ausgabe:

  

Die Funktion wurde bei der Zeilennummer genannt: 0

     16

Die Funktion wurde bei der Zeilennummer genannt

Eine Sache, hier zu erwähnen ist, dass in C ++ 11 Standard ist es möglich, Standardvorlage Werte für Funktionen geben Vorlage. In prä C ++ 11 Standardwerte für nicht-Typ Argumente scheinen nur Arbeit für Klassenvorlage Argumente. So wird in C ++ 11, würde es keine Notwendigkeit, doppelte Funktionsdefinitionen zu haben wie oben. In C ++ 11 sein auch gültig const char * Vorlage Argumente haben, aber es ist nicht möglich, sie mit Literale wie __FILE__ oder __func__ zu verwenden, wie erwähnt hier .

Also am Ende, wenn Sie mit C ++ oder C ++ 11 könnte dies eine sehr interessante Alternative als die Verwendung von Makros, die Rufnummer des Anrufers zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top