typeof-Operator in C

Lesezeit: 3 Minuten

Ist typeof in C wirklich ein Operator?
Ich denke, weil es in C keinen Polymorphismus gibt, dass zur Laufzeit nichts zu tun ist. Das heißt, die Antwort auf typeof ist zur Kompilierzeit bekannt. (Ich kann mir keine Verwendung von typeof vorstellen, die zur Kompilierzeit nicht bekannt wäre.) Es scheint also eher eine Kompilierungsdirektive als ein Operator zu sein.

Verwendet typeof irgendeine (Prozessor-)Laufzeit (in GCC)?

  • C hat Nr typeof Operator, das ist eine Compiler-Erweiterung.

    – Ed S.

    22. August 2012 um 21:16 Uhr

  • @EdS. Ich warte geduldig auf den Tag, an dem ich Ihren Kommentar als veraltet kennzeichnen kann, nichts für ungut. 🙂

    – Benutzer426

    17. November 2021 um 17:26 Uhr

  • @user426 Ich bin endlich ein Jedi-Meister geworden und warte so lange darauf, dass das C23-Komitee keine Sprachmerkmale hinzufügt *schluchzt ins Kissen*.

    – Jäger Köhler

    8. April um 12:10 Uhr


Benutzeravatar von Jens Gustedt
Jens Gustedt

Seit typeof eine Compiler-Erweiterung ist, gibt es nicht wirklich eine Definition dafür, aber in der Tradition von C wäre es ein Operator, z sizeof und _Alignof werden auch als Operatoren gesehen.

Und Sie irren sich, C hat dynamische Typen, die nur zur Laufzeit bestimmt werden: variabel modifizierte (VM) Typen.

size_t n = strtoull(argv[1], 0, 0);
double A[n][n];
typeof(A) B;

kann nur zur Laufzeit ermittelt werden.

Nachtrag 2021: Die Chancen stehen gut typeof mit ähnlichen Regeln wie für sizeof wird es in C23 schaffen.

  • Scheuen Sie sich nicht, zu verlinken interessante Quellen zu diesem thema 🙂

    – Nikolai Ruhe

    23. August 2012 um 16:17 Uhr


  • @NikolaiRuhe, hätte das nicht als Hauptressource für VM-Typen angesehen … aber wenn du das sagst 🙂

    – Jens Gustedt

    23. August 2012 um 16:21 Uhr

  • @dubbaluga, danke für deine Änderungsvorschläge, ich habe sie jetzt selbst angewendet.

    – Jens Gustedt

    26. August 2013 um 11:06 Uhr

  • Hoppla! Dasselbe gilt für ‘sizeof()’: Ich dachte, das Ergebnis wurde zur Kompilierzeit behoben, aber jetzt sehe ich, dass dies nicht der Fall ist.

    – kein Benutzer

    16. Januar 2014 um 18:58 Uhr

  • @JensGustedt Ich möchte Sie fragen, ob ich dies einen “dynamischen Typ” nennen kann, so wie wir Typen in anderen Sprachen wie Python nennen, da dies nur ein einfacher alter VLA ist, der einen bekannten Typ von hat double mit nur fehlenden Grenzen Größen. Wie auch immer, VLA's werden nicht empfohlen, da sie viel Code generieren und langsam sind. Bsp.: Linux hat alles entfernt

    – KMG

    29. Mai 2021 um 6:23 Uhr

Benutzeravatar von cnicutar
Cnicutar

Es ist eine GNU-Erweiterung. Kurz gesagt, es ist eine bequeme Möglichkeit, ein Objekt zu deklarieren, das den gleichen Typ wie ein anderes hat. Zum Beispiel:

int x;         /* Plain old int variable. */
typeof(x) y;   /* Same type as x. Plain old int variable. */

Es funktioniert vollständig zur Kompilierzeit und es wird hauptsächlich in Makros verwendet. Ein berühmtes Beispiel für das Verlassen auf Makros typeof ist container_of.

  • Denken Sie nicht, dass es beim Kompilieren vollständig funktioniert, obwohl ich zugeben muss, dass ich es nicht überprüft habe: Ich denke, es funktioniert auch für VLA und andere VM-Typen. Dies kann dann also erst zur Laufzeit ermittelt werden.

    – Jens Gustedt

    22. August 2012 um 22:04 Uhr

Es ist eine C-Erweiterung des GCC-Compilers, siehe http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

Es ist nicht gerade ein Operator, eher ein Schlüsselwort. Und nein, es macht keine Laufzeit-Magie.

Ein Fall, in dem Sie diese Erweiterung verwenden müssen, besteht darin, den Zeiger einer anonymen Struktur zu erhalten. Sie können diese Frage anhand eines Beispiels überprüfen.

  • Es gibt eine einfachere Lösung, die vollständig C89-kompatibel ist: Markieren Sie Ihre Strukturen.

    – Braden Best

    15. Dezember 2021 um 0:07 Uhr


  • Ich brauchte es, um mit einem Code umzugehen, den ich nicht ändern kann.

    – وليد تاج الدين

    16. März um 15:37 Uhr

  • Es gibt eine einfachere Lösung, die vollständig C89-kompatibel ist: Markieren Sie Ihre Strukturen.

    – Braden Best

    15. Dezember 2021 um 0:07 Uhr


  • Ich brauchte es, um mit einem Code umzugehen, den ich nicht ändern kann.

    – وليد تاج الدين

    16. März um 15:37 Uhr

1415790cookie-checktypeof-Operator in C

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

Privacy policy