2017-02-23 2 views
0

Was würde ich ist haben möchte etwas wie folgt aus:Holen Sie sich das Mutter-Funktion __FILE__

./client.out:functionC.c:78: Fehler blabla < --- Hier ist mein Problem

./client.out:client.c:98: Fehler blabla

Hier sind meine Beispielfunktionen

/* client.c */ 
int main(int argc, char *argv[]) { 

    if(functionCalled() == -1){ 
     fprintf(stderr, "%s:%s:%d: Error blabla\n", argv[0], __FILE__, __LINE__); 
    } 
    return 0; 
} 

/* functionC.c */ 
int functionCalled(){ 
    fprintf(stderr, "%s:%s:%d: Error blabla\n", ?????, __FILE__, __LINE__); 
    return -1; 
} 

Offensichtlich kann ich den main.c Namen über die Parameter nicht senden. Denken Sie, dass es möglich ist, das Mutterprogramm zu bekommen, das die Funktion aufruft? Ich habe einen Client und einen Server, der dieselbe Funktion aufruft, aber im Falle eines Fehlers muss ich wissen, welches Programm (Client oder Server) abgestürzt ist.

ANTWORT:

Verwendung: extern char *progName; im functionC.c und char *progName; in client.c

+0

Ich möchte nicht die Funktion erhalten, die das Problem verursacht hat, aber die 'mainProgram.out: program.c: line' – Hearner

+2

Warum können Sie nicht Argv [0] an Ihre Funktion übergeben? Es ist eine Variable wie jede andere –

+0

@ Jean-FrançoisFabre Ich versuchte Ihre __PRETTY_FUNCTION__ und die Antwort, die Sie gaben, aber es gibt nicht zurück, was ich brauchte. Ich habe meinen Beitrag bearbeitet Sie verstehen – Hearner

Antwort

1

Ja, Sie können tun, dass in Ihrer main.c Datei:

static const char *executable = NULL; 

const char *get_main_file() 
{ 
    return executable == NULL ? "????" : executable; 
} 

im Haupt:

int main(...) 
{ 
    executable = argv[0]; 
    ... 

und rufen Sie an dass get_main_file() von Ihren anderen Dateien. Auf diese Weise wird argv[0] Wert überall exportiert (vielleicht möchten Sie kosmetische Änderungen daran vornehmen, bearbeiten Sie es, um den vollständigen Pfad zu entfernen, was ziemlich einfach durch Hinzufügen des Offsets des letzten Pfadtrennzeichens zu executable, falls gefunden, wie basename getan werden kann)

Verwandte Themen