Variablentyp als Funktionsparameter übergeben

Lesezeit: 2 Minuten

Ist es möglich, den Variablentyp als Teil eines Funktionsparameters zu übergeben, z.

void foo(varType type)
{
  // Cast to global static
  unsigned char bar;
  bar = ((type *)(&static_array))->member;
}

Ich erinnere mich, dass es etwas mit GCCs zu tun hat typeof und mit Makros?

  • Nicht in Standard-C. Vielleicht in GCC, wenn Sie (Pech) Glück haben.

    – Jonathan Leffler

    12. Juli 2011 um 1:31 Uhr

Benutzer-Avatar
Umarmung

Sie könnten eine Aufzählung für alle möglichen Typen ermöglichen und einen Schalter verwenden, um die Dereferenzierung vorzunehmen:

typedef enum {
    CHAR,
    INT,
    FLOAT,
    DOUBLE
} TYPE;

void foo(TYPE t, void* x){
    switch
        case CHAR:
            (char*)x;
            break;
        case INT:
            (int*)x;
            break;
         ...
    }
}

  • Hallo hugomg, tut mir leid, aber ich verstehe die Alternative nicht. Könnten Sie ein wenig näher darauf eingehen? Vielen Dank 🙂

    Benutzer1636522

    19. März 2016 um 10:30 Uhr

  • Ich habe gerade festgestellt, dass die Alternative nicht so funktioniert, wie sie geschrieben wurde … also habe ich sie gelöscht. Aber die Grundidee, die ich ursprünglich hatte, war, Dinge im “objektorientierten” Stil zu codieren und Subtyp-Polymorphismus zu verwenden, um die Verzweigung anstelle einer switch-Anweisung durchzuführen.

    – Umarmung

    19. März 2016 um 13:04 Uhr

  • bei mir funktioniert es nur mit typedef: “typedef enum { CHAR, INT, FLOAT, DOUBLE } TYPE;”

    – ChaosPredictor

    12. Mai 2017 um 18:50 Uhr


Für eine Funktion ist das nicht möglich, da sie dann die Typen der Argumente (und alle anderen Symbole, die die Funktion verwendet) kennen muss, um funktionierenden Maschinencode zu generieren. Du könntest ein Makro ausprobieren wie:

#define foo(type_t) ({ \
    unsigned char bar; \
    bar = ((type_t*)(&static_array))->member; \
    ... \
    })

Benutzer-Avatar
Schwebender Fels

Äh, Natürlich du kannst. Verwenden Sie einfach ein Makro wie folgt:

#include <stdio.h>
#define swap(type, foo, bar) ({type tmp; tmp=foo; foo=bar; bar=tmp;})

int main() {
  int a=3, b=0;
  swap(int, a, b); // 👈 check it out!

  printf("a=%d, b=%d \n", a, b); // a=0, b=3
  return 0;
}

  • Sie übergeben hier nicht wirklich einen Typ an eine Funktion, sondern erstellen für jede Verwendung neuen Code.

    – Hände

    27. November 2020 um 16:14 Uhr

  • Um Zweifel zu vermeiden: ({...}) ist ein “Anweisungsausdruck”, der eine GCC-Erweiterung und kein Standard-C ist.

    – Hrsg.

    7. Februar um 20:17 Uhr

Ich sehe nicht, wie Sie dies im allgemeinen Fall tun könnten, da C a ist statisch typisierte Sprache.

Der Compiler muss zur Kompilierzeit wissen, um welchen Typ es sich handelt type * ist, um den Verweis auf generieren zu können ->member.

1386050cookie-checkVariablentyp als Funktionsparameter übergeben

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

Privacy policy