Makro Template



  • Hi,
    Ich würde gerne Folgendes durch den Präprozessor machen lassen.
    Ohne Konstanten zu deklarieren.

    #define FILE_BUFFER_SIZE_1 10
    #define FILE_BUFFER_SIZE_2 10000
    #define FILE_BUFFER_SIZE_3 10000
    
    #define  free_bytes(x) (FILE_BUFFER_SIZE_(x)+Buffer_ptr[x]-Buffer_pos_ptr[x])
    

    Und dann eben schreiben können

    free_bytes(1);
    free_bytes(2);
    free_bytes(3);
    


    Beim kopilieren bekomme ich die Fehlermeldung:

    Fehler: es gibt keine Argumente für »FILE_BUFFER_SIZE_«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »FILE_BUFFER_SIZE_« verfügbar sein muss
    matrix.cpp:60: Fehler: (mit »-fpermissive« wird G++ den Code akzeptieren, aber die Verwendung eines nicht deklarierten Namens ist veraltet)
    make: *** [matrix.o] Fehler 1

    Mit -fpermissive funktionierts auch nicht. Ihm fehlt in jedem Fall die dekleration von FILE_BUFFER_SIZE_

    --------------------------------------------------------------------------
    Was funktioniert ist:

    namespace buffer_size
        {
            const long int buf_size[3]={FILE_BUFFER_SIZE_1, FILE_BUFFER_SIZE_2 ,FILE_BUFFER_SIZE_3};
        }
    

    und dann das makro

    #define  free_bytes(x) (buffer_size::buf_size[x]+Buffer_ptr[x]-Buffer_pos_ptr[x])
    

    Ich würde gerne aber die Konstanten einsparen.
    Gruß



  • Nimm keine defines sondern konstanten. In deinem Fall ein konstantes Array.

    Was wahrscheinlich auch gehen wuerde waeren Enums.



  • 🙂
    Ich such doch nach einer Lösung ohne die Selben. Ich hoffe daß es duch templates irgendwie geht. (Auch wegen der compiler meldung)
    Gruß



  • AlexXXx schrieb:

    Ich such doch nach einer Lösung ohne die Selben.

    Aus welchem Grund?



  • Ich habs jetzt nicht getestestet, aber FILE_BUFFER_SIZE_##x statt FILE_BUFFER_SIZE_(x) sollte funktionieren. Dann darf aber bei free_bytes als Parameter nur eine hardgecodete Zahl angegeben werden, keine Variable und kein Ausdruck.



  • Jetzt aus garkeinem mehr.=)
    Hat sich erledigt. Wußte nicht daß der comiler so effizient mit const variablen umgehen kann.
    Gruß



  • @XMaster
    Hey danke da haut hin.
    Gibts auch ne Variante wo x nicht hard coded sein muß??
    Würde gerne ne variable nehmen.
    also ohne

    if(variable==1)
    makro(1)
    if(cariable==2)
    makro(2)
    .
    .
    .
    

    Gruß



  • Nein. Mit defines nicht. Nimm, wie schon gesagt das Array..


Anmelden zum Antworten