Frage
Gibt es eine Möglichkeit, die maximale Größe einer Zeichenfolge zu ermitteln, mit der korreliert wird? errno
zur Kompilierzeit (zur Präprozessorzeit wäre noch besser)? ZB eine Obergrenze an strlen(strerror(errno))
?
Meine Gedanken
Das Beste, was ich mir vorstellen kann, ist, ein Programm auszuführen, um eine Brute-Force-Suche über den Bereich eines int, über jedes Gebietsschema durchzuführen, um die mit jedem {errno, locale}-Paar verknüpfte Zeichenfolge zu erhalten, ihre Größe zu erhalten und einen Header zu generieren auf diesem System, dann das Einhängen in zB ein Makefile oder Autoconf oder was auch immer. Ich kann mir keinen besseren Weg vorstellen, aber es scheint lächerlich, dass es so wäre: Die Standardbibliothek für ein System hat diese Informationen eingebaut, wenn auch nur implizit. Gibt es wirklich keine gute Möglichkeit, diese Informationen zu erhalten?
Okay, ich gebe zu, dass die C- und/oder C++-Standards möglicherweise Fehlerzeichenfolgen zulassen, die zur Laufzeit generiert werden, z. B. mit umstandsspezifischen Meldungen (z strerror(EINVAL)
Geben Sie eine Zeichenfolge an, die von einem anderen Laufzeit-Metadatensatz abgeleitet wurde, wenn errno
wurde zuletzt eingestellt oder so) – nicht sicher, ob das so ist ist erlaubt, und ich würde eine solche Implementierung eigentlich begrüßen, aber ich habe noch nie von einer gehört, die dies tat oder mehr als eine Zeichenfolge für eine bestimmte {errno
locale}-Paar.
Motivation
Was ich speziell wollte (aber ich denke, diese Frage ist allgemeiner wertvoll, wie in den Kommentaren besprochen wurde), was zu dieser Frage geführt hat, war, die zugehörige Fehlerzeichenfolge verwenden zu können errno
im Systemaufruf/Funktion writev
. In meinem speziellen Anwendungsfall habe ich Zeichenfolgen aus verwendet argv
und errno
-verknüpfte Saiten. Dies stellte meine “Worst-Case” -Länge auf ein ARG_MAX
+ some max errno string length
+ size of a few other small strings
).
Jedes *nix-Dokument, das ich konsultiert habe, scheint darauf hinzudeuten writev
wird (oder “darf”, für den geringen Nutzen, den dieser Unterschied in diesem Fall ausmacht) einen Fehler machen errno
einstellen EINVAL
wenn die Summe der iov_len
Werte überlaufen SSIZE_MAX
. Intuitiv kenne ich jeden errno
Saite, die ich gesehen habe, ist sehr kurz, und in der Praxis ist dies kein Problem. Aber ich möchte nicht, dass mein Code auf irgendeinem System auf mysteriöse Weise überhaupt keinen Fehler ausgibt, wenn es möglich ist, dass diese Annahme falsch ist. Also habe ich Code geschrieben, um einen solchen Fall zu handhaben – aber gleichzeitig möchte ich nicht, dass dieser zusätzliche Code für die Plattformen einkompiliert wird, die ihn im Allgemeinen eindeutig nicht benötigen.
Die kombinierte Eingabe der bisherigen Antworten und Kommentare lässt mich zu der Annahme neigen, dass in meinem speziellen Anwendungsfall die “richtige” Lösung darin besteht, obszön lange Nachrichten einfach abzuschneiden – aber deshalb habe ich die Frage gestellt, wie ich es ursprünglich gemacht habe: solche Informationen würden auch bei der Auswahl einer Größe für einen Puffer helfen strerror_r
/strerror_s
(jeweils *nix/Windows) und sogar eine negative Antwort (zB “das kannst du wirklich nicht”) ist meiner Meinung nach nützlich für die Aufklärung anderer.
Verwandt
Diese Frage enthält Antworten für die von angegebenen Strings strerror_r
auf VxWorks, aber ich fühle mich nicht wohl dabei, das auf alle Systeme zu verallgemeinern.
C und C++ sind verschiedene Sprachen!
– zu ehrlich für diese Seite
30. März 2016 um 20:20 Uhr
@Olaf Obwohl ich Ihre Bemühungen, diese Unterscheidung deutlich zu machen, im Allgemeinen schätze, glaube ich, dass es in diesem Fall legitim ist, von C und C++ zusammen zu sprechen
errno
Konzept wird von beiden gleichermaßen verwendet. Es wäre willkürlich, eines der Tags dem anderen vorzuziehen.– 5gon12eder
30. März 2016 um 20:25 Uhr
Können Sie Ihr eigenes Maximum wählen und die Fehlermeldungen zur Laufzeit abschneiden?
– xrgb
30. März 2016 um 20:30 Uhr
Mir fehlt vielleicht etwas, aber eine Fehlermeldung, die größer als ssize_t ist, scheint auf jeder Plattform, auf der ssize_t größer als int8_t ist, völlig verrückt zu sein.
– zneak
30. März 2016 um 20:35 Uhr
Der C-Standard (und ich vermute der C++-Standard) wird diesbezüglich nicht weiterhelfen
SSIZE_MAX
wie es nicht definiertSSIZE_MAX
. WennSSIZE_MAX
für Ihren Code wichtig ist, schlagen Sie vor, die Umgebung von Interesse zu markieren, die sie definiert.– chux – Wiedereinsetzung von Monica
30. März 2016 um 21:01 Uhr