Was bedeutet char foo(|10|) in C?

Lesezeit: 2 Minuten

Benutzeravatar von gbronner
gbronner

Ich bin ein sehr erfahrener C-Programmierer, aber kürzlich bin ich auf einen Code auf einem Mainframe gestoßen, der eine lokale Variable hat. Dies ist in einer einfachen C-Funktion, die diese Variable deklariert, und dann strcpy / strcats zwei Saiten hinein und versucht dann eine fopen.

char foo(|10|);

Dieser Code ist sehr alt. Eventuell sogar K&R C alt. Ich frage mich, ob dies eine obskure Compiler-Erweiterung oder eine Anpassung an eine Tastatur ist, die keine hat [] oder etwas ähnliches.

Weiß jemand, ob diese Erklärung “besonders” ist?

Dies ist ein Standard-Z/OS-Mainframe. Ich bin mir nicht sicher, welcher Compiler verwendet wird.

  • Es ist ein IBM-Mainframe … ist es möglich, dass die Zeichencodierung ist EBCDIC? Glaubt man Wikipedia, fehlte das [ ] Zeichen, so dass ein C-Compiler, der mit EBCDIC-Quellen arbeiten soll, möglicherweise einen Ersatz definieren musste.

    – Nate Eldredge

    15. Dezember 2022 um 4:39 Uhr

  • … obwohl C genau für diesen Zweck Trigraph-Sequenzen definiert. Aber vielleicht ist das eine nicht standardisierte / vorstandardisierte Alternative.

    – Johannes Bollinger

    15. Dezember 2022 um 4:43 Uhr

  • @NateEldredge Könnte sein, aber diese Seite wird auch angezeigt | als nicht unbedingt vorhanden.

    – dbusch

    15. Dezember 2022 um 4:44 Uhr


  • Diese Frage würde auch auf Retrocomputing.SE gut ankommen

    – OmarL

    15. Dezember 2022 um 16:07 Uhr

Es scheint eine frühe oder nicht standardmäßige Form des Digraphen zu sein. Der Code wurde wahrscheinlich mit geschrieben EBCDIC anstelle von ASCII und EBCDIC nicht [ ] Zeichen (zumindest nicht in allen Codepages).

ich fand die Handbuch für SAS/C, ein C-Compiler, der offenbar für System/370 gedacht war. Auf Seite 2-10 (Seite 42 des pdf) können Sie die Liste sehen (| |) als “alternative Formen” für [ ].

(Obwohl anscheinend | ist auch nicht in allen Codepages; aber vielleicht war es in einer Codepage, die häufiger verwendet wurde? Ich weiß nicht.)

C99 enthielt auch Digraphen (und Trigraphen), um dasselbe Problem zu lösen, aber sie verwendeten <: :> wie die Digraphen, und ??( ??) für die Trigraphen.

  • Dies scheint richtig zu sein. Eine Google Books-Suche ergab einen kaum lesbaren Ausschnitt davon Dr. Dobbs Tagebuch ab 1993 zeigte dies an, dass MVS EBCDIC nicht unterstützte [ and ] und die Digraphen (| und |) wurden stattdessen verwendet.

    – sj95126

    15. Dezember 2022 um 5:05 Uhr


  • Digraphen wurden dem Standard C in C95 (ISO 9899/AMD1:1995) hinzugefügt.

    – Ludin

    15. Dezember 2022 um 7:39 Uhr

  • Danke – das kam aus einem ebcdic-Zeichensatz-Mainframe. Ich hatte von Trigraphen gehört (und überprüft!), aber noch nie zuvor von Digraphen in C-Code gehört!

    – gbronner

    15. Dezember 2022 um 17:46 Uhr

  • Trigraphen wurden im C++17-Standard entfernt. Alle großen Compiler haben noch Optional Unterstützung für sie, obwohl.

    – dan04

    15. Dezember 2022 um 19:48 Uhr

  • Aber @dan04 diese Frage bezieht sich auf die C-Sprache, nicht auf C++.

    – fabspro

    17. Dezember 2022 um 11:30 Uhr

1438110cookie-checkWas bedeutet char foo(|10|) in C?

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

Privacy policy