Kann jemand interne/externe Variablennamen erklären?

Lesezeit: 6 Minuten

Benutzer-Avatar
Hu bin

Im C-Buch heißt es:

Mindestens die ersten 31 Zeichen eines internen Namens sind signifikant. Für Funktionsnamen und externe Variablen kann die Zahl kleiner als 31 sein, da externe Namen von Assemblern und Ladeprogrammen verwendet werden können, über die die Sprache keine Kontrolle hat. Bei externen Namen garantiert der Standard die Eindeutigkeit nur für 6 Zeichen und einen einzigen Fall. Schlüsselwörter wie if, else, int, float usw. sind reserviert: Sie können sie nicht als Variablennamen verwenden. Sie müssen in Kleinbuchstaben geschrieben werden.

Kann jemand erklären, was “interner Name”, “externe Namen”, “externe Variablen” sind? Es wäre besser, wenn Sie ein Beispiel geben könnten.

  • Welches “C-Buch”? Heißt es eigentlich “ANSI C”?

    – Sternchen

    19. Oktober 2012 um 16:50 Uhr

  • @Jeff Es gibt ein Buch namens “The C Book” – amazon.com/The-Book-Featuring-Standard-Instruction/dp/… Ich vermute, darauf bezieht sich das OP.

    – Reed Copsey

    19. Oktober 2012 um 16:57 Uhr


  • Das sind die C89/C90-Standardgrenzen; der C99-Standard hebt diese Grenzen an (63 signifikante Anfangszeichen einer internen Kennung oder eines Makronamens … 31 signifikante Anfangszeichen einer externen Kennung …) mit einigen Vorbehalten zu universellen Zeichennamen in Namen. Die Grenzwerte sind für C2011 gleich. Beachten Sie, dass der C99-Standard Groß- und Kleinschreibung erfordert, wo der ursprüngliche C89-Standard dies nicht tat.

    – Jonathan Leffler

    19. Oktober 2012 um 19:36 Uhr


Benutzer-Avatar
O. Jones

Ich streichle meinen weißen Bart und spreche mit einer weisen und pompösen Stimme:

In den alten Tagen, als FORTRAN und COBOL die Computerwelt beherrschten, musste sich die aufstrebende Sprache C in bestehende Toolketten einfügen. Zu diesen Werkzeugketten gehörten Link-Editoren (a/k/a-Linker, a/k/a-Loader) und Assembler, die nur kurze 6-stellige Symbolnamen (Variablen und Funktionen) verarbeiteten.

C-Compiler für diese Toolchains mussten so tun, als wären Variablen- und Funktionsnamen kurz, wenn sie Objektdateien ausschrieben, die von den Link-Editoren verwendet werden sollten. Das war die schlechte Nachricht. Die gute Nachricht war, dass es viele Symbole in C-Programmen gibt, die nicht in den Objektdateien auftauchen müssen.

Zum Beispiel müssen die Namen von Funktionen … zB “main” und “sqrt” … in den Objektmodulen erscheinen, damit Code von anderen Objektmodulen sie verwenden könnte. Ebenso die Namen der globalen Variablen im “extern”-Stil. Das sind die externen Namen.

Aber alle anderen Namen in einem C-Programm, zum Beispiel die Namen von Variablen im Bereich von Funktionen, die Namen von Strukturelementen usw., mussten es nicht in die Objektmodule schaffen. Diese werden “interne Namen” genannt.

So könnten Sie beispielsweise diese C-Variablen in einer Funktion haben

 int myFavoriteItem;
 int myFavoriteThing;

und das wäre in Ordnung. Aber Sie könnten sie wie folgt als externe Variablen deklarieren:

 extern int myFavoriteItem;
 extern int myFavoriteThing;

Einige Systeme schrieben diese Namen in die Objektdateien, als ob sie sechs Buchstaben lang wären (weil die Objektdateien nicht wussten, was sie mit längeren Namen anfangen sollten). Sie würden dann auf die Objektdatei schauen, als ob sie so deklariert worden wären.

 extern int myFavo;
 extern int myFavo;

Das wären doppelte Deklarationen. Der C-Compiler musste so etwas abfangen und einen Fehler ausgeben, anstatt eine doppelte Deklaration in eine Objektdatei zu schreiben. Das war eine große Hilfe für Programmierer: Doppelte Deklarationen in Objektdateien erzeugten wirklich obskure Fehlermeldungen des Link-Editors.

Die von Ihnen zitierte Passage legt fest, dass Compiler mindestens 31 Zeichen eines internen Namens und 6 Zeichen eines externen Namens erkennen müssen. Moderne Compiler und Toolchains haben keine unterschiedlichen Namenslängenbeschränkungen mehr.

  • +1: Ich erinnere mich, dass ich in C für Code codiert habe, der von Fortran aufgerufen wurde … 6-Zeichen-Monocase. Es machte aussagekräftige Namen ein wenig schwierig (zumal es Namensraumregeln gab, also alle Namen mit ‘g’ begannen und die internen Funktionen mit ‘gk’ beginnen mussten und dann die nächsten beiden für den ‘Gerätetreiber’ reserviert waren (also ‘ gk0p’, ‘gk1t’ usw., wobei eine Gesamtsumme von zwei Buchstaben oder Ziffern übrig bleibt, um eine aussagekräftige Mnemonik zu ergeben!).

    – Jonathan Leffler

    19. Oktober 2012 um 19:40 Uhr


  • Für mehr Geschichte: Radix-50 scheint einer der Übeltäter zu sein. Es könnte auch erklären, warum $ in Symbolnamen erlaubt ist.

    – tc.

    8. März 2015 um 16:52 Uhr

  • Die DEC-Toolchains verwendeten mit Sicherheit RAD50-Symbole. Das $ Zeichen in Symbolen waren in vielen Assemblern Teil automatisch generierter Elemente, um mit Dingen wie Zeilennummern umzugehen.

    – O. Jones

    8. März 2015 um 17:13 Uhr

  • Lesen Sie die Antwort unten @naresh, bevor Sie versuchen, dies zu verdauen.

    – vielfältig

    30. Juni 2017 um 12:51 Uhr

Externe Namen:

“Externe” Namen sind solche, die für andere Kompilierungseinheiten sichtbar sind, wie nicht statische Funktionen und Variablen, die mit dem Schlüsselwort “extern” deklariert wurden. Diese Namen müssen für Linker und Loader verfügbar gemacht werden. In Ye Olden Days konnten einige Linker und Loader nur mit sehr kurzen Namen umgehen.

Interne Namen:

“Interne” Namen sind solche, die außerhalb des zu kompilierenden Moduls nicht sichtbar gemacht werden – im Grunde alles mit “statischem” Geltungsbereich oder alles, was lokal zu einer Funktion gehört. C-Compiler müssen mit diesen Namen umgehen, aber mit nichts anderem

“Interne Namen” sind Namen von Bezeichnern innerhalb einer Funktion (effektiv lokale Variablennamen).

“Externe Namen” wären die Namen der anderen Bezeichner, einschließlich der Namen von Funktionen und aller Bezeichner, die im globalen Bereich oder mit der Speicherklasse extern deklariert sind.

Grundsätzlich muss alles, was “extern sichtbar” sein muss, garantiert nur 6 eindeutige Zeichen (ohne Berücksichtigung der Groß-/Kleinschreibung) haben, was äußerst einschränkend ist.

In der Praxis ist dies kein Thema mehr. C99 hat diese Grenzen erhöht, und die meisten modernen Compiler heben diese Grenzen auf oder erhöhen sie erheblich. Zum Beispiel, Visual C++ lässt 247 Zeichen für die Eindeutigkeit zu in allen Bezeichnern (intern oder extern) beim Kompilieren von C.

  • Umfang ist irrelevant. Der C-Standard spezifiziert vier Geltungsbereiche: Funktion, Datei, Block und Funktionsprototyp. Keine davon ist global. Das relevante Konzept ist die Verknüpfung, die intern, extern oder keine sein kann. Bezeichner im Datei- und Blockbereich können eine externe Verknüpfung haben (oder nicht).

    – Eric Postpischil

    19. Oktober 2012 um 19:09 Uhr


Benutzer-Avatar
Nikos C.

Ein externer Name ist ein Bezeichner mit externer Verknüpfung. Damit ein Bezeichner eine externe Verknüpfung hat, muss er entweder ein nicht statischer Dateibereich sein oder ausdrücklich als „extern“ deklariert werden. Beispiel:

int global_variable;

int main(void)
{
    int local_variable;
    extern int extern_variable;
    return 0;
}

Im obigen Beispiel die Bezeichner global_variable und extern_variable sind externe Namen. local_variable ist ein interner Name.

Beachten Sie, dass die Anzahl der signifikanten Zeichen in der Praxis größer ist als nur 31 und 6. Der C-Compiler von Microsoft verwendet beispielsweise standardmäßig 247 signifikante Zeichen sowohl für interne als auch für externe Namen. GCC behandelt alle Zeichen interner Namen als signifikant. Die signifikanten Zeichen externer Namen hängen vom Linker ab (und auf den meisten Plattformen gilt die gleiche Regel wie bei internen Namen; alle Zeichen sind signifikant.)

Der ANSI-Standard gibt einfach die Mindestanzahl signifikanter Zeichen an, damit eine Implementierung standardkonform ist.

1368060cookie-checkKann jemand interne/externe Variablennamen erklären?

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

Privacy policy