Ist es sicher, argc und argv in der Hauptfunktion umzubenennen?

Lesezeit: 9 Minuten

Benutzeravatar von yanpas
Yanpas

Viele Programme verwenden Standardnamen für eine Reihe von Argumenten und String-Arrays. Der Prototyp der Hauptfunktion sieht so aus: int main(int argc, char *argv[]);. Aber würde ich etwas kaputt machen, wenn ich benutzerdefinierte Namen für diese Variablen wähle?

Z.B int main(int n_of_args, char *args[]);

Im Kontext des Compilers ist alles in Ordnung. Diese Variablen sind lokal für die Hauptfunktion, können also beliebige Namen haben. Und der einfache Code baut und läuft perfekt. Aber diese Namen können vom Präprozessor verwendet werden. Ist es also sicher, diese Argumente umzubenennen?

PS Ich persönlich finde diese Namen schlecht, da sie sich sehr ähnlich sehen und sich nur in einem Buchstaben unterscheiden. Aber JEDER benutzt sie aus irgendeinem Grund.

  • Ja, völlig ungefährlich.

    – David Hölzer

    29. April 2016 um 18:56 Uhr

  • Wie alle Antworten sagen, ja, es ist sicher. Aber tu das bitte nicht. Jeder weiß was argc und argv sind. n_of_args und args könnte jemandem klarer sein, der C oder C++ nicht kennt – aber das ist nicht Ihre Zielgruppe.

    – Keith Thompson

    29. April 2016 um 19:07 Uhr

  • Du kann tun, ist dies nicht Grund genug, dies zu tun. Jeder weiß, was das ist, und sie erwarten, dass sie so sind.

    – SergejA

    29. April 2016 um 19:48 Uhr

  • Wenn die Frage genau lautet “Würde ich etwas kaputt machen, wenn ich benutzerdefinierte Namen wähle”, dann lautet die genaue Antwort “Ja, Sie würden die gut etablierte Tradition brechen” 😉

    – Frax

    29. April 2016 um 20:33 Uhr

  • Dreh sie einfach um! .. und von Anfang an legst du den Grundstein für Arbeitsplatzsicherheit 🙂

    – jano

    29. April 2016 um 21:23 Uhr

Benutzeravatar von dbush
dbusch

Ja, es ist sicher, solange Sie gültige Variablennamen verwenden. Sie sind lokale Variablen, daher geht ihr Geltungsbereich nicht über die hinaus main Funktion.

Aus Abschnitt 5.1.2.2.1 des C-Standard:

Die beim Programmstart aufgerufene Funktion wird benannt main. Die Implementierung deklariert keinen Prototyp für diese Funktion. Es muss mit einem Rückgabetyp von definiert werden int und ohne Parameter:

int main(void) { /*  ... */ }

oder mit zwei Parametern (hier als argc und argv, Es können jedoch beliebige Namen verwendet werden, da sie lokal für die Funktion sind, in der sie deklariert werden):

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

oder gleichwertig; oder auf eine andere implementierungsdefinierte Weise

Davon abgesehen, verwenden Sie etwas anderes als argc und argv könnte andere verwirren, die Ihren Code lesen und an die konventionellen Namen für diese Parameter gewöhnt sind. Also besser auf der Seite der Klarheit irren.

Benutzeravatar von Nick Matteo
Nick Matteo

Die Namen argc und argv wurden tatsächlich vom C++-Standard vor C++11 vorgeschrieben. Darin hieß es:

Alle Implementierungen müssen die beiden folgenden Definitionen von main zulassen:

int main ()

und

int main ( int argc , char * argv [])

und fuhr fort, die Anforderungen zu diskutieren argc und argv.

Technisch gesehen war jedes Programm, das andere Namen verwendete, nicht standardkonform, und der Compiler durfte es ablehnen. Natürlich hat dies kein Compiler tatsächlich getan. Sehen diesen Thread auf comp.std.c++oder Abschnitt 3.6.1 der dieser C++03-Standardentwurf.

Dies war mit ziemlicher Sicherheit nur ein Versehen und wurde in C++11 geändert, was stattdessen besagt

Alle Implementierungen sollen beides zulassen

  • eine Funktion von () zurückgeben int und
  • eine Funktion von (intZeiger auf Zeiger auf char) Rückkehr int

als Art von main (8.3.5). In der letzteren Form wird zu Darstellungszwecken der erste Funktionsparameter aufgerufen argc und der zweite Funktionsparameter aufgerufen wird argv,…

Benutzeravatar von πάντα ῥεῖ
πάντα ῥεῖ

Natürlich können Sie diese Parameter umbenennen sicher wie es Dir gefällt

int main(int wrzlbrnft, char* _42[]) {
}

Namen sind in Sand geschrieben. Sie haben keinen Einfluss auf den endgültig kompilierten Code.


Wichtig ist nur, dass Deklarations- und Definitionstyp der Parameter tatsächlich zusammenpassen.

Die Unterschrift des main() Die Funktion ist grundsätzlich als deklariert

int main(int, char*[]);

Wenn Sie sie tatsächlich in einer Implementierung verwenden müssen, müssen Sie sie benennen. Welche Namen verwendet werden, ist wie bereits erwähnt eigentlich unerheblich.

  • nur einige Identifikatoren sind “in den Sand geschrieben”, wie Sie es ausdrücken. Funktionsnamen sind es sicherlich nicht.

    – Steve Cox

    29. April 2016 um 20:35 Uhr

  • @SteveCox “Funktionsnamen sind es sicherlich nicht.” Am Ende sind sie es. Nur eine Menge Sandkörner 😛 …

    – πάντα ῥεῖ

    29. April 2016 um 20:36 Uhr


  • ok aber im ernst. Nach der Kompilierung enthält der Objektcode immer noch Funktionsnamen. sonst würde das verlinken nicht funktionieren

    – Steve Cox

    29. April 2016 um 20:42 Uhr


  • @πάνταῥεῖ: Wenn Sie sich nicht besonders bemühen, sie zu entfernen, verbleiben Funktionsnamen in der endgültigen ausführbaren Datei.

    – Nick Matteo

    30. April 2016 um 19:43 Uhr

  • @Kundor: Nach dem Verknüpfen unter Windows behalten alle nicht speziellen Funktionen die Namen nicht bei

    – Daniel

    16. Juli 2016 um 18:46 Uhr

Benutzeravatar von coredump
Core-Dump

Ja. Es ist sicher, es sieht komisch aus, aber es wird nichts kaputt gehen.

Ja, es ist sicher, verschiedene Namen zu verwenden.

Ich persönlich würde es jedoch nicht als traditionelles empfehlen argc und argv sind so weithin bekannt und jedem anderen C-Programmierer vertraut, der jemals mit Ihrem Code arbeiten könnte. Auf lange Sicht wird die Verwendung eigener, spezieller, anderer Namen bei Ihren Lesern viel mehr Verwirrung und/oder Frustration hervorrufen, als Sie jemals retten werden, weil Ihnen Ihre Namen besser gefallen.

“Wenn du in Rom bist, mach wie es die Römer tun.”

  • Dennoch gibt es einige ziemlich offensichtliche Szenarien, die die Verwendung unterschiedlicher Namen erfordern, ein berüchtigtes ist die Initialisierung von GLUT, glutInit(&argc, argv), wo die Argumente anders deklariert und initialisiert werden müssen, damit GLUT keine Kommandozeilenargumente auffrisst, es sei denn, wir wollen das. SO-Link

    – Benutzer3078414

    29. April 2016 um 23:16 Uhr

  • @ user3078414 Interessantes Beispiel, aber ich sehe nicht, wie es etwas darüber aussagt, wie die Variablen benannt werden müssen. Nach den Beispielen in dieser anderen Frage könnten wir genauso einfach schreiben int dummyargc = 1; char *dummyargv[1] = {(char*)"Something"}; glutInit(&dummyargc, dummyargv);.

    – Steve Gipfel

    29. April 2016 um 23:24 Uhr


  • Danke, @steve-summit. Einige API-Dokumentationen sind irreführend, daher ist dieser Thread am hilfreichsten, um die argc argv Namenskonvention, ebenso wie Ihre beitragende Antwort. Ich habe meinen Kommentar nur als Beispiel für die Verwendung unterschiedlicher Namen angegeben. Hier ist der SO-Link

    – Benutzer3078414

    29. April 2016 um 23:35 Uhr


Benutzeravatar von orbitcowboy
Orbitcowboy

Ja, Sie können sie beliebig umbenennen. Sie sind einfach Funktionsparameternamen, nichts weiter.

  • Dennoch gibt es einige ziemlich offensichtliche Szenarien, die die Verwendung unterschiedlicher Namen erfordern, ein berüchtigtes ist die Initialisierung von GLUT, glutInit(&argc, argv), wo die Argumente anders deklariert und initialisiert werden müssen, damit GLUT keine Kommandozeilenargumente auffrisst, es sei denn, wir wollen das. SO-Link

    – Benutzer3078414

    29. April 2016 um 23:16 Uhr

  • @ user3078414 Interessantes Beispiel, aber ich sehe nicht, wie es etwas darüber aussagt, wie die Variablen benannt werden müssen. Nach den Beispielen in dieser anderen Frage könnten wir genauso einfach schreiben int dummyargc = 1; char *dummyargv[1] = {(char*)"Something"}; glutInit(&dummyargc, dummyargv);.

    – Steve Gipfel

    29. April 2016 um 23:24 Uhr


  • Danke, @steve-summit. Einige API-Dokumentationen sind irreführend, daher ist dieser Thread am hilfreichsten, um die argc argv Namenskonvention, ebenso wie Ihre beitragende Antwort. Ich habe meinen Kommentar nur als Beispiel für die Verwendung unterschiedlicher Namen angegeben. Hier ist der SO-Link

    – Benutzer3078414

    29. April 2016 um 23:35 Uhr


Ich habe das Gefühl, dass jeder die technischen C++-Regeln gut und gut abgedeckt hat: Die Antwort ist ja. Lassen wir die Tradition und die Tatsache beiseite, dass diese eine bestimmte Funktion besonders und ikonisch ist, die gültige Punkte enthält, die auf dieser Grundlage nicht geändert werden sollten.

Oft habe ich das Gefühl, dass die Philosophie der Entscheidungen selten diskutiert wird, und wollte daher eine Perspektive zu diesem Thema anbieten, da ich es für wichtig halte, warum dies zu Beginn gefragt wurde.

Diese Frage beinhaltet für mich die Wahl, Englisch im Allgemeinen im Code auszudrücken. Sie scheinen sich an kurzen Handbeschreibungen zu stören, insbesondere wenn die kurze Hand ähnlich aussehenden Text landet. In Ihrem Beispiel bewirkt das Ändern von argn in n_of_args jedoch nur das Ändern einer Art von Kurzschrift in eine andere Form von Kurzschrift ohne wirklichen Mehrwert: Klarstellung oder andere sichtbare Eigenschaften.

Das Wort „Nummer“ wurde durch den Buchstaben „n“ ersetzt.

Wenn Sie einen Shorthand-Namen über die Anti-Shorthand-Philosophie ändern, dann scheint so etwas angemessener zu sein:

main( int argumentCount, char ** argumentVector )

Ich denke immer über zwei Dinge nach: Dinge nach dem zu benennen, was sie sind und/oder nach ihrer impliziten Verwendung. Es einen argumentVector zu nennen, ist für mich überflüssig, da die Eigenschaft, ein Vektor zu sein, durch die doppelte Indirektion ** impliziert wird. Daher ist eine bessere lange Hand dafür, wie ich Code schreiben würde: ** Argumente.

Einige würden sagen, dass die Variable namens argumentCount als int deklariert ist und ein Count nicht negativ sein kann, aber Sie können ein negatives int haben {unsigned is better}.

Auch hier spielt es eine Rolle, was es ist und wie es verwendet wird. Wenn es sich um einen Count handelt, würde ich davon ausgehen, dass er niemals negativ ist. Wie können Sie schließlich eine Anzahl von -2 Äpfeln haben? Ich würde sagen, du schuldest zwei Äpfel. Wenn es sich um eine Zahl handelt, würde ich erwarten, dass ein negativer Fall möglich ist. Aus diesem Grund ist Ihnen das zusätzliche Wort „von“ wahrscheinlich wichtig. Dies und vielleicht eine Zahl, auf die sich eine Sammlung bezieht, impliziert eher einen bestimmten Gegenstand als eine Eigenschaft der Sammlung selbst. Dh: argumentsNumber = 5 impliziert ein bestimmtes Argument, aber nicht numberOfArguments.

main( int maxArgumentsIndex, char ** Argumente ).

Dadurch werden Mehrdeutigkeiten beseitigt. Wenn Sie es einen Index nennen, wird die Mehrdeutigkeit von negativen Groß- und Kleinschreibung entfernt und es wird auch beschrieben, was es ist und wie es verwendet wird. Es impliziert auch durch den englischen Wortlaut, dass ein max ein absolutes ist und sich komisch anfühlen würde, Code zu schreiben, der diesen Wert modifiziert (es sollte const sein). ‘Argumente’ macht hier Sinn, da es Plural ist, beschreibt, was es ist und wie es bereits verwendet werden sollte. Selbst eine Interpretation auf diese Weise kann gefährlich sein, da ein Index -1 von Count/NumberOf ist. 5 Argumente ergeben einen maxIndex von 4!!

Jede andere Funktion und ich würde vollständig verwenden:

void-Funktion (const unsigned int maxArgumentsIndex, const char ** Argumente)

Nicht alle Situationen verdienen ausführliche Beschreibungen. Tatsächlich führt manchmal eine Kurzschrift zu mehr Lesbarkeit, insbesondere beim Schreiben von Mathematikkursen wie Vec3f, Matrix, Quaternion usw. Ich werde fast immer versuchen, eher die mathematische Sprache als die linguistische zu finden . Float x, y, z vrs. float xComponent und dergleichen.

Ich verstehe, dass dies alles eine Stilentscheidung ist, aber sich der Entscheidungen bewusst zu sein, wird auf lange Sicht wirklich helfen. Ich garantiere, dass erfahrene Programmierer sich darüber ärgern, wenn Arrays nicht im Plural geschrieben werden, aber andererseits ist main eine spezielle Existenzprosa 😉

1419180cookie-checkIst es sicher, argc und argv in der Hauptfunktion umzubenennen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy