Dies ist eine grundlegende Frage, aber dennoch eine wichtige Frage ...
Beim Starten eines C ++ - Programms, dessen Hauptmethode die folgende gemeinsame Signatur hat:
%Vor%Ist args [0] immer der Pfad zum aktuell laufenden Programm? Was ist mit Cross-Plattform (da ich in einer Linux-Umgebung bin, aber später portieren kann)?
Es ist nicht immer so. Es ist der Wert, den Sie dem Programm vom Betriebssystem gegeben haben. Wenn Sie beispielsweise ein Programm mit exec
starten, können Sie dies auf einen beliebigen Wert setzen:
Der erste Parameter ist die zu startende Datei und argv wird argv [0] und alle anderen Parameter für main enthalten. envp enthält die Umgebungsvariablen (nicht definiert durch Standard C oder C ++. Dies ist eine Posix-Sache).
Genauer gesagt ist dies die Definition von argv in C ++:
%Vor%Eine Implementierung soll die Hauptfunktion nicht vorgeben. Diese Funktion darf nicht überlastet werden. Es sollte haben einen Rückgabetyp vom Typ int, aber ansonsten ist der Typ implementierungsdefiniert. Alle Implementierungen Erlauben beide der folgenden Definitionen von main:
%Vor%und
In der letzteren Form ist argc die Anzahl der Argumente, die dem Programm von der Umgebung in auf dem das Programm ausgeführt wird. Wenn argc ungleich Null ist, müssen diese Argumente in
argv[0]
through angegeben werdenargv[argc-1]
als Zeiger auf die Anfangszeichen von nullterminierten Multibyte-Strings (NTMBSs) (17.3.2.1.3.2) undargv[0]
sollen der Zeiger auf das Anfangszeichen eines NTMBS sein, der den Name zum Aufruf des Programms oder "". Der Wert von argc soll nicht negativ sein. Der Wert vonargv[argc]
muss 0 sein. [Hinweis: Es wird empfohlen, alle weiteren (optionalen) Parameter nachher hinzuzufügen argv. ]
Es liegt an der Implementierung, was einen "Namen zum Aufruf des Programms" definiert. Wenn Sie den vollständigen Pfad Ihrer ausführbaren Datei abrufen möchten, können Sie GetModuleFileName unter Windows und argv[0]
(um den Namen zu erhalten, der für die Ausführung verwendet wird, können relativ sein) zusammen mit getcwd
(um das aktuelle Arbeitsverzeichnis zu erhalten, versuche den Namen absolut zu machen).
Nein. Unter Windows garantiert GetModuleFileName den exakten vollständigen Pfad zum aktuell ausgeführten Programm. Unter Linux gibt es einen Symlink / proc / self / exe. Führen Sie einen Readlink auf diesem Symlink aus, um den vollständigen Pfad des gerade ausgeführten Programms zu erhalten. Auch wenn Ihr Programm über einen Symlink aufgerufen wurde / proc / self / exe zeigt immer auf das aktuelle Programm.
Hier ist, was der C-Standard sagt, dass argv[0]
sein sollte:
Wenn der Wert von
argc
größer als ist Null, der String, auf den gezeigt wirdargv[0]
steht für den Programmnamen;argv[0][0]
soll der Nullwert sein Zeichen, wenn der Programmname nicht ist verfügbar in der Host-Umgebung.
Ob es den vollständigen Pfad enthält, ist die Antwort, dass argv [0] nicht unbedingt den vollständigen Pfad zur ausführbaren Datei enthält. Unter Windows scheint es genau das zu sein, was in der Befehlszeile angegeben wurde. Weiß nicht, was Linux / Unix macht.
Tags und Links c++