Mit welcher Header-Datei soll ich aufrufen? #include um PATH_MAX als Int zur Größenanpassung einer Zeichenfolge verwenden zu können?
Ich möchte erklären können:
char *current_path[PATH_MAX];
Aber wenn ich das tue, gibt mein Compiler (Clang/LLVM unter Linux) den folgenden Fehler aus:
recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
^
Ich habe versucht, eine Google-Suche durchzuführen, aber immer noch kein Glück.
#include <limits.h> Behebt das Problem/den Fehler NICHT.
Bin ich auch richtig, dass der Wert von PATH_MAX ein Int ist?
Bitte sehen Sie sich diese Frage an: stackoverflow.com/questions/833291/…
– Josh Brown
25. Februar 2012 um 23:56 Uhr
Du willst wahrscheinlich char current_path[PATH_MAX]; Anstatt von char *current_path[PATH_MAX]; – Sie möchten eher eine Zeichenfolge als ein Array von Zeigern.
– John Carter
25. Februar 2012 um 23:57 Uhr
oder dieses hier stackoverflow.com/questions/4267390/…
– qdii
25. Februar 2012 um 23:59 Uhr
Shiplu Mokadim
Es ist in linux/limits.h. #define PATH_MAX 4096 /* # chars in a path name including nul */
Warten Sie … bedeutet das, dass PATH_MAX linuxspezifisch und nicht Teil eines Standards ist?
– Eduard Falk
15. Juni 2016 um 16:45 Uhr
Sie sollten wahrscheinlich verwenden; sieht eindeutig nicht-portabel aus.
– Eduard Falk
15. Juni 2016 um 16:51 Uhr
Achtung: PATH_MAX unterscheidet sich von NAME_MAX (und der x-referenzierte Artikel scheint diese beiden teilweise zu verwechseln, zumindest teilweise). Hinweis: POSIX <limits.h> sagt: Auf eine Definition einer der symbolischen Konstanten in der folgenden Liste soll verzichtet werden <limits.h> Header […] wobei der entsprechende Wert gleich oder größer als das angegebene Minimum ist, wobei der Wert jedoch je nach Datei, auf die er angewendet wird, variieren kann. Der tatsächliche Wert, der für einen bestimmten Pfadnamen unterstützt wird, soll von der Funktion pathconf() bereitgestellt werden.
– Jonathan Leffler
9. August 2016 um 4:07 Uhr
Pfadnamen sind sehr böse, unsicher und path_max ist eine Lüge und nicht einmal eine Konstante (es kann bei verschiedenen Betriebssystemfunktionen unterschiedlich sein). Es ist ein schreckliches Feature und sollte so schnell wie möglich ersetzt werden.
– Lothar
22. Dezember 2017 um 19:21 Uhr
Kumashiro
Beachten Sie, dass noch unklar ist, ob PATH_MAX definiert eine maximale Länge mit oder ohne abschließendem Null-Byte. Es kann das eine oder andere auf verschiedenen Betriebssystemen sein. Wenn Sie während der Kompilierung nicht prüfen können, um welche Groß-/Kleinschreibung es sich handelt, ist es sicherer, eine künstliche Begrenzung zu erzwingen PATH_MAX - 1. Sicher ist sicher. (Natürlich müssen Sie noch mindestens reservieren PATH_MAX Byte Speicher zum Puffern der Zeichenfolge.)
> {PATH_MAX} Maximale Anzahl von Bytes in einem Pfadnamen, einschließlich des abschließenden Nullzeichens. Ab POSIX ’01.
– Muh Karma
20. März 2014 um 16:51 Uhr
Beachten Sie, dass POSIX 2008 die Verwirrung beseitigt hat — <limits.h> (Begründung): {PATH_MAX} IEEE PASC Interpretation 1003.1 #15 befasste sich mit der Inkonsistenz im Standard mit der Definition des Pfadnamens und der Beschreibung von {PATH_MAX}, wodurch Anwendungsentwickler entweder {PATH_MAX} oder {PATH_MAX}+1 Bytes zuweisen konnten. Die Inkonsistenz wurde durch Korrektur der {PATH_MAX}-Definition beseitigt, um das Nullzeichen aufzunehmen. Mit dieser Änderung werden Anwendungen, die zuvor {PATH_MAX} Bytes zugewiesen haben, weiterhin erfolgreich sein.
– Jonathan Leffler
9. August 2016 um 4:09 Uhr
Beachten Sie auch, dass Sie nicht verwenden sollten PATH_MAX - 1aber PATH_MAX + 1. Sie müssen nicht mehr, aber Sie möchten ein Byte für die hinzufügen '\0'.
Und selbst das reicht nicht. PATH_MAX muss nicht definiert werden: “Eine Definition einer der symbolischen Konstanten in der folgenden Liste entfallen von dem <limits.h> Header bei bestimmten Implementierungen, bei denen der entsprechende Wert gleich oder größer als das angegebene Minimum ist, der Wert jedoch je nach Datei, auf die er angewendet wird, variieren kann. Der tatsächliche Wert, der für einen bestimmten Pfadnamen unterstützt wird, wird von bereitgestellt pathconf() function.” Da Linux-Dateisysteme unterschiedliche Werte unterstützen, ist es wahrscheinlich eine Verletzung des POSIX-Standards für Linux, dies zu definieren PATH_MAX.
– Andreas Henle
4. Februar 2020 um 13:55 Uhr
Was bedeutet definieren _POSIX_C_SOURCE tun? Mir wurde gesagt, dass man sollte noch nie Definieren Sie eine Variable, die mit a beginnt _ im eigenen Programm.
– vy32
7. Mai 2021 um 11:34 Uhr
@vy32 _POSIX_C_SOURCE ist ein Feature-Test-Makro.
– Fluss
2. Dezember 2021 um 13:22 Uhr
@flux – Okay … also sollte ich es nicht definieren?
– vy32
2. Dezember 2021 um 18:56 Uhr
@vy32 Es hängt davon ab, was Sie tun möchten. Bitte informieren Sie sich über Feature-Test-Makros.
– Fluss
3. Dezember 2021 um 10:08 Uhr
Kemin Zhou
Bei der einfachen C-Programmierung bin ich auf die gleiche Herausforderung gestoßen. Auf Ihrem speziellen Linux-System enthält das Verzeichnis /usr/include viele , hier Header-Dateien, die für ein Linux-Betriebssystem spezifisch sind.
find . -name "*.h" | xargs grep PATH_MAX
Sie sollten mehrere Header sehen, die PATH_MAX definieren; leider wurde dieser Wert in verschiedenen Headern unterschiedlich definiert. Hier ist eine Auflistung von meinem Ubuntu (ich habe auch manuell einige falsch positive Treffer aus dem grep-Programm entfernt).
Der Header /linux/limits.h hatte die größte Zahl und sollte am authentischsten enthalten sein. Eine alternative Strategie besteht darin, Ihren eigenen Namen mit einem anderen Namen zu definieren, z. B. PATHLEN (4080 ist lang genug für die meisten praktischen Situationen). Mein Hauptpunkt ist, zu lernen, find zu verwenden, um nach Antworten auf Ihre Frage zu suchen.
Benutzer3104363
PATH_MAX ist eine Systemgrenze. In der POSIX-Umgebung gibt es drei Kategorien von Systemgrenzen. Eine dieser Kategorien ist Pfadname-Variablenwerte. Systemgrenzen, die vom Dateisystem abhängen, fallen in diese Kategorie. PATHMAX ist auch der Pfadname-Variablenwert. (Dieser Wert kann sich also von Dateisystem zu Dateisystem ändern.) Daher kann das PATHNAME-Limit erreicht werden pathconf()/fpathconf() POSIX-Funktionen. Auf diese Weise können Sie das PATHNAME-Limit eines bestimmten Dateisystems portieren. Beispielcode ist wie folgt:
Interessant zu sehen, was pathconf(“\\\\?\\c$”,_PC_PATH_MAX) unter Windows zurückgibt. (Dateinamen, die mit „\\?\“ in Windows beginnen, können bis zu 32 KB lang sein. Aus offensichtlichen Gründen nie ein beliebtes Feature und auch für Windows UNC-Dateinamen völlig unbrauchbar).
– Robin Davis
30. August 2021 um 5:45 Uhr
Interessant zu sehen, was pathconf(“\\\\?\\c$”,_PC_PATH_MAX) unter Windows zurückgibt. (Dateinamen, die mit „\\?\“ in Windows beginnen, können bis zu 32 KB lang sein. Aus offensichtlichen Gründen nie ein beliebtes Feature und auch für Windows UNC-Dateinamen völlig unbrauchbar).
– Robin Davis
30. August 2021 um 5:45 Uhr
14235500cookie-checkWo ist PATH_MAX in Linux definiert?yes
Bitte sehen Sie sich diese Frage an: stackoverflow.com/questions/833291/…
– Josh Brown
25. Februar 2012 um 23:56 Uhr
Du willst wahrscheinlich
char current_path[PATH_MAX];
Anstatt vonchar *current_path[PATH_MAX];
– Sie möchten eher eine Zeichenfolge als ein Array von Zeigern.– John Carter
25. Februar 2012 um 23:57 Uhr
oder dieses hier stackoverflow.com/questions/4267390/…
– qdii
25. Februar 2012 um 23:59 Uhr